]> git.mxchange.org Git - simgear.git/blob - simgear/route/route.hxx
Patch from Erik Hofman:
[simgear.git] / simgear / route / route.hxx
1 /**
2  * \file route.hxx
3  * Provides a class to manage a list of waypoints (i.e. a route).
4  */
5
6 // Written by Curtis Olson, started October 2000.
7 //
8 // Copyright (C) 2000  Curtis L. Olson  - curt@hfrl.umn.edu
9 //
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.
14 //
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.
19 //
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.
23 //
24 // $Id$
25
26
27 #ifndef _ROUTE_HXX
28 #define _ROUTE_HXX
29
30
31 #ifndef __cplusplus                                                          
32 # error This library requires C++
33 #endif                                   
34
35
36 #include <simgear/compiler.h>
37
38 #include STL_STRING
39 #include <vector>
40
41 SG_USING_STD(string);
42 SG_USING_STD(vector);
43
44 #include <simgear/route/waypoint.hxx>
45
46 /**
47  * A class to manage a list of waypoints (i.e. a route).
48  */
49
50 class SGRoute {
51
52 private:
53
54     typedef vector < SGWayPoint > route_list;
55     route_list route;
56     int current_wp;
57
58 public:
59
60     /** Constructor */
61     SGRoute();
62
63     /** Destructor */
64     ~SGRoute();
65
66     /** Clear the entire route */
67     inline void clear() {
68         route.clear();
69         current_wp = 0;
70     }
71
72     /**
73      * Add a waypoint.
74      * @param wp a waypoint
75      */
76     inline void add_waypoint( const SGWayPoint &wp ) {
77         route.push_back( wp );
78
79         int size = route.size();
80         if ( size > 1 ) {
81             SGWayPoint next_to_last = route[ size - 2 ];
82             double tmpd, tmpc;
83             wp.CourseAndDistance( next_to_last, &tmpc, &tmpd );
84             route[size - 1].set_distance( tmpd );
85         }
86     }
87
88     /**
89      * Get the number of waypoints (i.e. route length )
90      * @return route length
91      */
92     inline int size() const { return route.size(); }
93
94     /**
95      * Get the front waypoint.
96      * @return the first waypoint.
97      */
98     inline SGWayPoint get_first() const {
99         if ( route.size() ) {
100             return route[0];
101         } else {
102             return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
103         }
104     }
105
106     /**
107      * Get the current waypoint
108      * @return the current waypoint
109      */
110     inline SGWayPoint get_current() const {
111         if ( current_wp < (int)route.size() ) {
112             return route[current_wp];
113         } else {
114             return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
115         }
116     }
117
118     /**
119      * Set the current waypoint
120      * @param number of waypoint to make current.
121      */
122     inline void set_current( int n ) {
123         if ( n >= 0 && n < (int)route.size() ) {
124             current_wp = n;
125         }
126     }
127
128     /** Increment the current waypoint pointer. */
129     inline void increment_current() {
130         if ( current_wp < (int)route.size() - 1 ) {
131             ++current_wp;
132         }
133     }
134
135     /**
136      * Get the nth waypoint
137      * @param n waypoint number
138      * @return the nth waypoint
139      */
140     inline SGWayPoint get_waypoint( const int n ) const {
141         if ( n < (int)route.size() ) {
142             return route[n];
143         } else {
144             return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
145         }
146     }
147
148     /** Delete the front waypoint */
149     inline void delete_first() {
150         if ( route.size() ) {
151             route.erase( route.begin() );
152         }
153     }
154
155     /**
156      * Calculate perpendicular distance from the current route segment
157      * This routine assumes all points are laying on a flat plane and
158      * ignores the altitude (or Z) dimension.  For most accurate
159      * results, use with CARTESIAN way points.
160      */
161     double distance_off_route( double x, double y ) const;
162 };
163
164
165 #endif // _ROUTE_HXX