• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
  • routing
Route.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2011 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "Route.h"
12 
13 namespace Marble
14 {
15 
16 Route::Route() :
17  m_distance( 0.0 ),
18  m_travelTime( 0 ),
19  m_positionDirty( true ),
20  m_closestSegmentIndex( -1 )
21 {
22  // nothing to do
23 }
24 
25 void Route::addRouteSegment( const RouteSegment &segment )
26 {
27  if ( segment.isValid() ) {
28  m_bounds = m_bounds.isEmpty() ? segment.bounds() : m_bounds.united( segment.bounds() );
29  m_distance += segment.distance();
30  m_path << segment.path();
31  if ( segment.maneuver().position().longitude() != 0.0 || segment.maneuver().position().latitude() != 0.0 ) {
32  m_turnPoints << segment.maneuver().position();
33  }
34  if ( segment.maneuver().hasWaypoint() ) {
35  m_waypoints << segment.maneuver().waypoint();
36  }
37  m_segments.push_back( segment );
38  m_positionDirty = true;
39 
40  for ( int i=1; i<m_segments.size(); ++i ) {
41  m_segments[i-1].setNextRouteSegment(&m_segments[i]);
42  }
43  }
44 }
45 
46 GeoDataLatLonBox Route::bounds() const
47 {
48  return m_bounds;
49 }
50 
51 qreal Route::distance() const
52 {
53  return m_distance;
54 }
55 
56 int Route::size() const
57 {
58  return m_segments.size();
59 }
60 
61 const RouteSegment & Route::at( int index ) const
62 {
63  return m_segments[index];
64 }
65 
66 const GeoDataLineString & Route::path() const
67 {
68  return m_path;
69 }
70 
71 int Route::travelTime() const
72 {
73  return m_travelTime;
74 }
75 
76 const GeoDataLineString & Route::turnPoints() const
77 {
78  return m_turnPoints;
79 }
80 
81 const GeoDataLineString & Route::waypoints() const
82 {
83  return m_waypoints;
84 }
85 
86 void Route::setPosition( const GeoDataCoordinates &position )
87 {
88  m_position = position;
89  m_positionDirty = true;
90 }
91 
92 GeoDataCoordinates Route::position() const
93 {
94  return m_position;
95 }
96 
97 void Route::updatePosition() const
98 {
99  if ( !m_segments.isEmpty() ) {
100  if ( m_closestSegmentIndex < 0 || m_closestSegmentIndex >= m_segments.size() ) {
101  m_closestSegmentIndex = 0;
102  }
103 
104  qreal distance = m_segments[m_closestSegmentIndex].distanceTo( m_position, m_currentWaypoint, m_positionOnRoute );
105  QList<int> candidates;
106 
107  for ( int i=0; i<m_segments.size(); ++i ) {
108  if ( i != m_closestSegmentIndex && m_segments[i].minimalDistanceTo( m_position ) <= distance ) {
109  candidates << i;
110  }
111  }
112 
113  GeoDataCoordinates closest, interpolated;
114  foreach( int i, candidates ) {
115  qreal const dist = m_segments[i].distanceTo( m_position, closest, interpolated );
116  if ( distance < 0.0 || dist < distance ) {
117  distance = dist;
118  m_closestSegmentIndex = i;
119  m_positionOnRoute = interpolated;
120  m_currentWaypoint = closest;
121  }
122  }
123  }
124 
125  m_positionDirty = false;
126 }
127 
128 const RouteSegment & Route::currentSegment() const
129 {
130  if ( m_positionDirty ) {
131  updatePosition();
132  }
133 
134  if ( m_closestSegmentIndex < 0 || m_closestSegmentIndex >= m_segments.size() ) {
135  static RouteSegment invalid;
136  return invalid;
137  }
138 
139  return m_segments[m_closestSegmentIndex];
140 }
141 
142 GeoDataCoordinates Route::positionOnRoute() const
143 {
144  if ( m_positionDirty ) {
145  updatePosition();
146  }
147 
148  return m_positionOnRoute;
149 }
150 
151 GeoDataCoordinates Route::currentWaypoint() const
152 {
153  if ( m_positionDirty ) {
154  updatePosition();
155  }
156 
157  return m_currentWaypoint;
158 }
159 
160 }
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::GeoDataLatLonBox::isEmpty
virtual bool isEmpty() const
Indicates whether the bounding box is not initialised (and contains nothing).
Definition: GeoDataLatLonBox.cpp:768
Marble::Route::at
const RouteSegment & at(int index) const
Definition: Route.cpp:61
Marble::RouteSegment::path
const GeoDataLineString & path() const
Definition: RouteSegment.cpp:43
Marble::Route::Route
Route()
Definition: Route.cpp:16
Marble::Route::position
GeoDataCoordinates position() const
Definition: Route.cpp:92
Marble::Route::size
int size() const
Definition: Route.cpp:56
Marble::Route::bounds
GeoDataLatLonBox bounds() const
Definition: Route.cpp:46
Marble::GeoDataLatLonBox::united
GeoDataLatLonBox united(const GeoDataLatLonBox &other) const
Returns the bounding LatLonBox of this box with the given one.
Definition: GeoDataLatLonBox.cpp:446
Marble::Route::addRouteSegment
void addRouteSegment(const RouteSegment &segment)
Definition: Route.cpp:25
Marble::Maneuver::waypoint
GeoDataCoordinates waypoint() const
Definition: Maneuver.cpp:81
Marble::Route::waypoints
const GeoDataLineString & waypoints() const
Definition: Route.cpp:81
Marble::RouteSegment::isValid
bool isValid() const
Definition: RouteSegment.cpp:90
Marble::GeoDataCoordinates::latitude
qreal latitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the latitude of the GeoDataCoordinates object use the unit parameter to switch between Radi...
Definition: GeoDataCoordinates.cpp:751
Marble::RouteSegment::bounds
GeoDataLatLonBox bounds() const
Definition: RouteSegment.cpp:67
Route.h
Marble::Route::setPosition
void setPosition(const GeoDataCoordinates &position)
Definition: Route.cpp:86
Marble::Maneuver::hasWaypoint
bool hasWaypoint() const
Definition: Maneuver.cpp:86
QList< int >
Marble::GeoDataLineString
A LineString that allows to store a contiguous set of line segments.
Definition: GeoDataLineString.h:75
Marble::Route::distance
qreal distance() const
Definition: Route.cpp:51
Marble::Route::currentSegment
const RouteSegment & currentSegment() const
Definition: Route.cpp:128
Marble::GeoDataCoordinates::longitude
qreal longitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the longitude of the GeoDataCoordinates object use the unit parameter to switch between Rad...
Definition: GeoDataCoordinates.cpp:739
Marble::Route::positionOnRoute
GeoDataCoordinates positionOnRoute() const
Definition: Route.cpp:142
Marble::Route::currentWaypoint
GeoDataCoordinates currentWaypoint() const
Definition: Route.cpp:151
Marble::Route::travelTime
int travelTime() const
Definition: Route.cpp:71
Marble::Route::turnPoints
const GeoDataLineString & turnPoints() const
Definition: Route.cpp:76
Marble::Route::path
const GeoDataLineString & path() const
Definition: Route.cpp:66
Marble::RouteSegment
Definition: RouteSegment.h:23
Marble::RouteSegment::distance
qreal distance() const
Definition: RouteSegment.cpp:27
Marble::Maneuver::position
GeoDataCoordinates position() const
Definition: Maneuver.cpp:71
Marble::RouteSegment::maneuver
const Maneuver & maneuver() const
Definition: RouteSegment.cpp:32
Marble::GeoDataLatLonBox
A class that defines a 2D bounding box for geographic data.
Definition: GeoDataLatLonBox.h:51
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal