]> git.mxchange.org Git - simgear.git/blob - simgear/route/route.cxx
Merge branch 'maint'
[simgear.git] / simgear / route / route.cxx
1 // route.cxx -- Class to manage a list of waypoints (route)
2 //
3 // Written by Curtis Olson, started October 2000.
4 //
5 // Copyright (C) 2000  Curtis L. Olson  - curt@hfrl.umn.edu
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License as
9 // published by the Free Software Foundation; either version 2 of the
10 // License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 // General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with this program; if not, write to the Free Software
19 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
20 //
21 // $Id$
22
23 #ifdef HAVE_CONFIG_H
24 #  include <simgear_config.h>
25 #endif
26
27 #include <plib/sg.h>
28
29 #include <simgear/math/vector.hxx>
30
31 #include "route.hxx"
32
33
34 // constructor
35 SGRoute::SGRoute() {
36     route.clear();
37 }
38
39
40 // destructor
41 SGRoute::~SGRoute() {
42 }
43
44 /** Update the length of the leg ending at waypoint index */
45 void SGRoute::update_distance_and_track(int index)
46 {
47   SGWayPoint& curr = route[ index ];
48   double course, dist;
49
50   if ( index == 0 ) {
51     dist = 0;
52     course = 0.0;
53   } else {
54     const SGWayPoint& prev = route[index - 1];
55     curr.CourseAndDistance( prev, &course, &dist );
56   }
57
58   curr.set_distance(dist);
59   curr.set_track(course);
60 }
61
62 /**
63  * Add waypoint (default), or insert waypoint at position n.
64  * @param wp a waypoint
65  */
66 void SGRoute::add_waypoint( const SGWayPoint &wp, int n ) {
67     int size = route.size();
68     if ( n < 0 || n >= size ) {
69         n = size;
70         route.push_back( wp );
71     } else {
72         route.insert( route.begin() + n, 1, wp );
73         // update distance of next leg if not at end of route
74         update_distance_and_track( n + 1 );
75     }
76     update_distance_and_track( n );
77 }
78
79 /** Delete waypoint with index n  (last one if n < 0) */
80 void SGRoute::delete_waypoint( int n ) {
81     int size = route.size();
82     if ( size == 0 )
83         return;
84     if ( n < 0 || n >= size )
85         n = size - 1;
86
87     route.erase( route.begin() + n );
88     // update distance of next leg if not at end of route
89     if ( n < size - 1 )
90         update_distance_and_track( n );
91 }
92
93 double SGRoute::total_distance() const {
94   double total = 0.0;
95   for (unsigned int i=0; i<route.size(); ++i) {
96     total += route[i].get_distance();
97   }
98   return total;
99 }