//
// $Id$
-
-#include <plib/sg.h>
-
-#include <simgear/math/vector.hxx>
+#ifdef HAVE_CONFIG_H
+# include <simgear_config.h>
+#endif
#include "route.hxx"
SGRoute::~SGRoute() {
}
-
-// Calculate perpendicular distance from the current route segment
-// This routine assumes all points are laying on a flat plane and
-// ignores the altitude (or Z) dimension. For best results, use with
-// CARTESIAN way points.
-double SGRoute::distance_off_route( double x, double y ) const {
- if ( current_wp > 0 ) {
- int n0 = current_wp - 1;
- int n1 = current_wp;
- sgdVec3 p, p0, p1, d;
- sgdSetVec3( p, x, y, 0.0 );
- sgdSetVec3( p0,
- route[n0].get_target_lon(), route[n0].get_target_lat(),
- 0.0 );
- sgdSetVec3( p1,
- route[n1].get_target_lon(), route[n1].get_target_lat(),
- 0.0 );
- sgdSubVec3( d, p0, p1 );
-
- return sqrt( sgdClosestPointToLineDistSquared( p, p0, d ) );
-
- } else {
- // We are tracking the first waypoint so there is no route
- // segment. If you add the current location as the first
- // waypoint and the actual waypoint as the second, then we
- // will have a route segment and calculate distance from it.
-
- return 0;
- }
-}
-
/** Update the length of the leg ending at waypoint index */
-void SGRoute::update_distance(int index)
+void SGRoute::update_distance_and_track(int index)
{
- SGWayPoint& curr = route[ index ];
- double course, dist;
-
- if ( index == 0 ) {
- dist = 0;
- } else {
- const SGWayPoint& prev = route[ index - 1 ];
- curr.CourseAndDistance( prev, &course, &dist );
- }
-
- curr.set_distance( dist );
+ SGWayPoint& curr = route[ index ];
+ double course, dist;
+
+ if ( index == 0 ) {
+ dist = 0;
+ course = 0.0;
+ } else {
+ const SGWayPoint& prev = route[index - 1];
+ curr.CourseAndDistance( prev, &course, &dist );
+ }
+
+ curr.set_distance(dist);
+ curr.set_track(course);
}
/**
} else {
route.insert( route.begin() + n, 1, wp );
// update distance of next leg if not at end of route
- update_distance( n + 1 );
+ update_distance_and_track( n + 1 );
}
- update_distance( n );
+ update_distance_and_track( n );
}
/** Delete waypoint with index n (last one if n < 0) */
route.erase( route.begin() + n );
// update distance of next leg if not at end of route
if ( n < size - 1 )
- update_distance( n );
+ update_distance_and_track( n );
+}
+
+double SGRoute::total_distance() const {
+ double total = 0.0;
+ for (unsigned int i=0; i<route.size(); ++i) {
+ total += route[i].get_distance();
+ }
+ return total;
}