]> git.mxchange.org Git - simgear.git/blob - simgear/route/route.hxx
Csaba HALASZ:
[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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 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     void update_distance(int index);
59
60 public:
61
62     /** Constructor */
63     SGRoute();
64
65     /** Destructor */
66     ~SGRoute();
67
68     /** Clear the entire route */
69     inline void clear() {
70         route.clear();
71         current_wp = 0;
72     }
73
74     /**
75      * Add waypoint (default), or insert waypoint at position n.
76      * @param wp a waypoint
77      */
78     void add_waypoint( const SGWayPoint &wp, int n = -1 );
79     /**
80      * Get the number of waypoints (i.e. route length )
81      * @return route length
82      */
83     inline int size() const { return route.size(); }
84
85     /**
86      * Get the front waypoint.
87      * @return the first waypoint.
88      */
89     inline SGWayPoint get_first() const {
90         if ( route.size() ) {
91             return route[0];
92         } else {
93             return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
94         }
95     }
96
97     /**
98      * Get the current waypoint
99      * @return the current waypoint
100      */
101     inline SGWayPoint get_current() const {
102         if ( current_wp < (int)route.size() ) {
103             return route[current_wp];
104         } else {
105             return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
106         }
107     }
108
109     /**
110      * Set the current waypoint
111      * @param number of waypoint to make current.
112      */
113     inline void set_current( int n ) {
114         if ( n >= 0 && n < (int)route.size() ) {
115             current_wp = n;
116         }
117     }
118
119     /** Increment the current waypoint pointer. */
120     inline void increment_current() {
121         if ( current_wp < (int)route.size() - 1 ) {
122             ++current_wp;
123         }
124     }
125
126     /**
127      * Get the nth waypoint
128      * @param n waypoint number
129      * @return the nth waypoint
130      */
131     inline SGWayPoint get_waypoint( const int n ) const {
132         if ( n < (int)route.size() ) {
133             return route[n];
134         } else {
135             return SGWayPoint( 0.0, 0.0, 0.0, SGWayPoint::WGS84, "invalid" );
136         }
137     }
138
139     /** Delete the front waypoint */
140     inline void delete_first() { delete_waypoint(0); }
141
142     /** Delete waypoint waypoint with index n  (last one if n < 0) */
143     void delete_waypoint( int n = 0 );
144
145     /**
146      * Calculate perpendicular distance from the current route segment
147      * This routine assumes all points are laying on a flat plane and
148      * ignores the altitude (or Z) dimension.  For most accurate
149      * results, use with CARTESIAN way points.
150      */
151     double distance_off_route( double x, double y ) const;
152 };
153
154
155 #endif // _ROUTE_HXX