3 * Provides a class to manage a list of waypoints (i.e. a route).
6 // Written by Curtis Olson, started October 2000.
8 // Copyright (C) 2000 Curtis L. Olson - curt@hfrl.umn.edu
10 // This program is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU General Public License as
12 // published by the Free Software Foundation; either version 2 of the
13 // License, or (at your option) any later version.
15 // This program is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // General Public License for more details.
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
32 # error This library requires C++
40 #include <simgear/compiler.h>
48 #include <simgear/route/waypoint.hxx>
51 * A class to manage a list of waypoints (i.e. a route).
58 typedef vector < SGWayPoint > route_list;
70 /** Clear the entire route */
78 * @param wp a waypoint
80 inline void add_waypoint( const SGWayPoint &wp ) {
81 route.push_back( wp );
83 int size = route.size();
85 SGWayPoint next_to_last = route[ size - 2 ];
87 wp.CourseAndDistance( next_to_last, &tmpc, &tmpd );
88 route[size - 1].set_distance( tmpd );
93 * Get the number of waypoints (i.e. route length )
94 * @return route length
96 inline int size() const { return route.size(); }
99 * Get the front waypoint.
100 * @return the first waypoint.
102 inline SGWayPoint get_first() const {
103 if ( route.size() ) {
106 return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
111 * Get the current waypoint
112 * @return the current waypoint
114 inline SGWayPoint get_current() const {
115 if ( current_wp < (int)route.size() ) {
116 return route[current_wp];
118 return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
123 * Set the current waypoint
124 * @param number of waypoint to make current.
126 inline void set_current( int n ) {
127 if ( n >= 0 && n < (int)route.size() ) {
132 /** Increment the current waypoint pointer. */
133 inline void increment_current() {
134 if ( current_wp < (int)route.size() - 1 ) {
140 * Get the nth waypoint
141 * @param n waypoint number
142 * @return the nth waypoint
144 inline SGWayPoint get_waypoint( const int n ) const {
145 if ( n < (int)route.size() ) {
148 return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
152 /** Delete the front waypoint */
153 inline void delete_first() {
154 if ( route.size() ) {
155 route.erase( route.begin() );
160 * Calculate perpendicular distance from the current route segment
161 * This routine assumes all points are laying on a flat plane and
162 * ignores the altitude (or Z) dimension. For most accurate
163 * results, use with CARTESIAN way points.
165 double distance_off_route( double x, double y ) const;