Csaba HALASZ:
- fix bug that messed up leg distances after inserting and deleting waypoints not at the end of the route - move add_waypoint() and delete_waypoint from hxx to cxx - beef up routetest
This commit is contained in:
+48
-1
@@ -49,7 +49,7 @@ double SGRoute::distance_off_route( double x, double y ) const {
|
|||||||
int n1 = current_wp;
|
int n1 = current_wp;
|
||||||
sgdVec3 p, p0, p1, d;
|
sgdVec3 p, p0, p1, d;
|
||||||
sgdSetVec3( p, x, y, 0.0 );
|
sgdSetVec3( p, x, y, 0.0 );
|
||||||
sgdSetVec3( p0,
|
sgdSetVec3( p0,
|
||||||
route[n0].get_target_lon(), route[n0].get_target_lat(),
|
route[n0].get_target_lon(), route[n0].get_target_lat(),
|
||||||
0.0 );
|
0.0 );
|
||||||
sgdSetVec3( p1,
|
sgdSetVec3( p1,
|
||||||
@@ -68,3 +68,50 @@ double SGRoute::distance_off_route( double x, double y ) const {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Update the length of the leg ending at waypoint index */
|
||||||
|
void SGRoute::update_distance(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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add waypoint (default), or insert waypoint at position n.
|
||||||
|
* @param wp a waypoint
|
||||||
|
*/
|
||||||
|
void SGRoute::add_waypoint( const SGWayPoint &wp, int n ) {
|
||||||
|
int size = route.size();
|
||||||
|
if ( n < 0 || n >= size ) {
|
||||||
|
n = size;
|
||||||
|
route.push_back( wp );
|
||||||
|
} 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( n );
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Delete waypoint with index n (last one if n < 0) */
|
||||||
|
void SGRoute::delete_waypoint( int n ) {
|
||||||
|
int size = route.size();
|
||||||
|
if ( size == 0 )
|
||||||
|
return;
|
||||||
|
if ( n < 0 || n >= size )
|
||||||
|
n = size - 1;
|
||||||
|
|
||||||
|
route.erase( route.begin() + n );
|
||||||
|
// update distance of next leg if not at end of route
|
||||||
|
if ( n < size - 1 )
|
||||||
|
update_distance( n );
|
||||||
|
}
|
||||||
|
|||||||
+4
-23
@@ -55,6 +55,8 @@ private:
|
|||||||
route_list route;
|
route_list route;
|
||||||
int current_wp;
|
int current_wp;
|
||||||
|
|
||||||
|
void update_distance(int index);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** Constructor */
|
/** Constructor */
|
||||||
@@ -73,21 +75,7 @@ public:
|
|||||||
* Add waypoint (default), or insert waypoint at position n.
|
* Add waypoint (default), or insert waypoint at position n.
|
||||||
* @param wp a waypoint
|
* @param wp a waypoint
|
||||||
*/
|
*/
|
||||||
void add_waypoint( const SGWayPoint &wp, int n = -1 ) {
|
void add_waypoint( const SGWayPoint &wp, int n = -1 );
|
||||||
if ( n < 0 || n >= (int)route.size() )
|
|
||||||
route.push_back( wp );
|
|
||||||
else
|
|
||||||
route.insert( route.begin() + n, 1, wp );
|
|
||||||
|
|
||||||
int size = route.size();
|
|
||||||
if ( size > 1 ) {
|
|
||||||
SGWayPoint next_to_last = route[ size - 2 ];
|
|
||||||
double tmpd, tmpc;
|
|
||||||
wp.CourseAndDistance( next_to_last, &tmpc, &tmpd );
|
|
||||||
route[size - 1].set_distance( tmpd );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the number of waypoints (i.e. route length )
|
* Get the number of waypoints (i.e. route length )
|
||||||
* @return route length
|
* @return route length
|
||||||
@@ -152,14 +140,7 @@ public:
|
|||||||
inline void delete_first() { delete_waypoint(0); }
|
inline void delete_first() { delete_waypoint(0); }
|
||||||
|
|
||||||
/** Delete waypoint waypoint with index n (last one if n < 0) */
|
/** Delete waypoint waypoint with index n (last one if n < 0) */
|
||||||
void delete_waypoint( int n = 0 ) {
|
void delete_waypoint( int n = 0 );
|
||||||
if ( !route.size() )
|
|
||||||
return;
|
|
||||||
if ( n < 0 || n >= (int)route.size() )
|
|
||||||
n = route.size() - 1;
|
|
||||||
|
|
||||||
route.erase( route.begin() + n );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate perpendicular distance from the current route segment
|
* Calculate perpendicular distance from the current route segment
|
||||||
|
|||||||
@@ -8,8 +8,20 @@
|
|||||||
|
|
||||||
SG_USING_STD(cout);
|
SG_USING_STD(cout);
|
||||||
SG_USING_STD(endl);
|
SG_USING_STD(endl);
|
||||||
|
|
||||||
int main() {
|
void dump_route(const SGRoute& route, const char* message)
|
||||||
|
{
|
||||||
|
cout << "Route dump: " << message << endl;
|
||||||
|
for (int i = 0; i < route.size(); i++) {
|
||||||
|
const SGWayPoint wp = route.get_waypoint(i);
|
||||||
|
cout << "\t#" << i << " " << wp.get_id() << " (" << wp.get_target_lat()
|
||||||
|
<< ", " << wp.get_target_lon() << ") @" << wp.get_target_alt()
|
||||||
|
<< " dist: " << wp.get_distance() << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
SGRoute route;
|
SGRoute route;
|
||||||
|
|
||||||
route.add_waypoint( SGWayPoint(0, 0, 0, SGWayPoint::CARTESIAN, "Start") );
|
route.add_waypoint( SGWayPoint(0, 0, 0, SGWayPoint::CARTESIAN, "Start") );
|
||||||
@@ -17,7 +29,8 @@ int main() {
|
|||||||
route.add_waypoint( SGWayPoint(2, 0, 0, SGWayPoint::CARTESIAN, "2") );
|
route.add_waypoint( SGWayPoint(2, 0, 0, SGWayPoint::CARTESIAN, "2") );
|
||||||
route.add_waypoint( SGWayPoint(2, 2, 0, SGWayPoint::CARTESIAN, "3") );
|
route.add_waypoint( SGWayPoint(2, 2, 0, SGWayPoint::CARTESIAN, "3") );
|
||||||
route.add_waypoint( SGWayPoint(4, 2, 0, SGWayPoint::CARTESIAN, "4") );
|
route.add_waypoint( SGWayPoint(4, 2, 0, SGWayPoint::CARTESIAN, "4") );
|
||||||
|
|
||||||
|
dump_route(route, "Init");
|
||||||
route.set_current( 1 );
|
route.set_current( 1 );
|
||||||
|
|
||||||
cout << "( 0.5, 0 ) = " << route.distance_off_route( 0.5, 0 ) << endl;
|
cout << "( 0.5, 0 ) = " << route.distance_off_route( 0.5, 0 ) << endl;
|
||||||
@@ -29,5 +42,12 @@ int main() {
|
|||||||
cout << "( 2, 4 ) = " << route.distance_off_route( 2, 4 ) << endl;
|
cout << "( 2, 4 ) = " << route.distance_off_route( 2, 4 ) << endl;
|
||||||
cout << "( 2.5, 4 ) = " << route.distance_off_route( 2.5, 4 ) << endl;
|
cout << "( 2.5, 4 ) = " << route.distance_off_route( 2.5, 4 ) << endl;
|
||||||
|
|
||||||
|
SGWayPoint wp2 = route.get_waypoint(2);
|
||||||
|
route.delete_waypoint(2);
|
||||||
|
dump_route(route, "removed WP2");
|
||||||
|
|
||||||
|
route.add_waypoint(wp2, 3);
|
||||||
|
dump_route(route, "added back WP2 after WP3");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user