-// route.hxx -- Class to manage a list of waypoints (route)
-//
+/**
+ * \file route.hxx
+ * Provides a class to manage a list of waypoints (i.e. a route).
+ */
+
// Written by Curtis Olson, started October 2000.
//
// Copyright (C) 2000 Curtis L. Olson - curt@hfrl.umn.edu
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
-// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// $Id$
#define _ROUTE_HXX
-#ifndef __cplusplus
+#ifndef __cplusplus
# error This library requires C++
-#endif
-
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
#endif
#include <simgear/compiler.h>
-#include STL_STRING
#include <vector>
-FG_USING_STD(string);
-FG_USING_STD(vector);
+using std::vector;
#include <simgear/route/waypoint.hxx>
+/**
+ * A class to manage a list of waypoints (i.e. a route).
+ */
class SGRoute {
route_list route;
int current_wp;
+ void update_distance_and_track(int index);
+
public:
+ /** Constructor */
SGRoute();
+
+ /** Destructor */
~SGRoute();
- // clear the entire route
+ /** Clear the entire route */
inline void clear() {
route.clear();
current_wp = 0;
}
- // add a waypoint
- inline void add_waypoint( const SGWayPoint &wp ) {
- route.push_back( 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
+ /**
+ * Add waypoint (default), or insert waypoint at position n.
+ * @param wp a waypoint
+ */
+ void add_waypoint( const SGWayPoint &wp, int n = -1 );
+ /**
+ * Get the number of waypoints (i.e. route length )
+ * @return route length
+ */
inline int size() const { return route.size(); }
- // get the front waypoint
+ /**
+ * Get the front waypoint.
+ * @return the first waypoint.
+ */
inline SGWayPoint get_first() const {
if ( route.size() ) {
return route[0];
}
}
- // get the current waypoint
+ /**
+ * Get the current waypoint
+ * @return the current waypoint
+ */
inline SGWayPoint get_current() const {
if ( current_wp < (int)route.size() ) {
return route[current_wp];
return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
}
}
+
+ inline SGWayPoint get_previous() const {
+ if ( (current_wp > 0) && (current_wp < (int)route.size()) ) {
+ return route[current_wp - 1];
+ } else {
+ return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
+ }
+ }
+
+ inline SGWayPoint get_next() const {
+ if ( (current_wp + 1) < (int)route.size() ) {
+ return route[current_wp+1];
+ } else {
+ return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
+ }
+ }
- // set the current waypoint
+ /**
+ * Set the current waypoint
+ * @param number of waypoint to make current.
+ */
inline void set_current( int n ) {
if ( n >= 0 && n < (int)route.size() ) {
current_wp = n;
}
}
- // increment the current waypoint
+ inline int current_index() const {
+ return current_wp;
+ }
+
+ /** Increment the current waypoint pointer. */
inline void increment_current() {
if ( current_wp < (int)route.size() - 1 ) {
++current_wp;
}
}
- // get the nth waypoint
+ /**
+ * Get the nth waypoint
+ * @param n waypoint number
+ * @return the nth waypoint
+ */
inline SGWayPoint get_waypoint( const int n ) const {
if ( n < (int)route.size() ) {
return route[n];
}
}
- // delete the front waypoint
- inline void delete_first() {
- if ( route.size() ) {
- route.erase( route.begin() );
- }
- }
+ /** Delete the front waypoint */
+ inline void delete_first() { delete_waypoint(0); }
- // 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 distance_off_route( double x, double y ) const;
+ /** Delete waypoint waypoint with index n (last one if n < 0) */
+ void delete_waypoint( int n = 0 );
+
+ /**
+ * Helper, sum the distance members of each waypoint
+ */
+ double total_distance() const;
};