Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'routing/index_graph_starter.cpp')
-rw-r--r--routing/index_graph_starter.cpp36
1 files changed, 26 insertions, 10 deletions
diff --git a/routing/index_graph_starter.cpp b/routing/index_graph_starter.cpp
index 22b64eb012..31b696f7c3 100644
--- a/routing/index_graph_starter.cpp
+++ b/routing/index_graph_starter.cpp
@@ -40,20 +40,35 @@ m2::PointD const & IndexGraphStarter::GetPoint(Joint::Id jointId)
return m_graph.GetPoint(jointId);
}
-m2::PointD const & IndexGraphStarter::GetPoint(RoadPoint const & rp)
+DirectedEdge const & IndexGraphStarter::FindFakeEdge(uint32_t fakeFeatureId)
{
- if (!IsFakeFeature(rp.GetFeatureId()))
- return m_graph.GetPoint(rp);
-
+ ASSERT(IsFakeFeature(fakeFeatureId), ("Feature", fakeFeatureId, "is not a fake one"));
for (DirectedEdge const & e : m_fakeZeroLengthEdges)
{
ASSERT_EQUAL(GetPoint(e.GetFrom()), GetPoint(e.GetTo()), ());
- if (e.GetFeatureId() == rp.GetFeatureId())
- return GetPoint(e.GetFrom());
+ if (e.GetFeatureId() == fakeFeatureId)
+ return e;
}
- CHECK(false,
- (rp, "is a point of a fake feature but it's not contained in |m_fakeZeroLengthEdges|"));
- return m_graph.GetPoint(rp);
+ CHECK(false, ("Fake feature:", fakeFeatureId, "has to be contained in |m_fakeZeroLengthEdges|"));
+ return m_fakeZeroLengthEdges.front();
+}
+
+m2::PointD const & IndexGraphStarter::GetPoint(RoadPoint const & rp)
+{
+ if (!IsFakeFeature(rp.GetFeatureId()))
+ return m_graph.GetPoint(rp);
+
+ // Fake edges have zero length so coords of "point from" and "point to" are equal.
+ return GetPoint(FindFakeEdge(rp.GetFeatureId()).GetFrom());
+}
+
+RoadGeometry IndexGraphStarter::GetFakeRoadGeometry(uint32_t fakeFeatureId)
+{
+ DirectedEdge const & e = FindFakeEdge(fakeFeatureId);
+ ASSERT_EQUAL(GetPoint(e.GetFrom()), GetPoint(e.GetTo()), ());
+ // Note. |e| is a zero length edge so speed could be any number which is not equal to zero.
+ return RoadGeometry(true /* one way */, 1.0 /* speed */,
+ RoadGeometry::Points({GetPoint(e.GetFrom()), GetPoint(e.GetTo())}));
}
void IndexGraphStarter::RedressRoute(vector<Joint::Id> const & route,
@@ -86,7 +101,8 @@ void IndexGraphStarter::RedressRoute(vector<Joint::Id> const & route,
uint32_t const pointFrom = rp0.GetPointId();
uint32_t const pointTo = rp1.GetPointId();
- RoadGeometry const roadGeometry = m_graph.GetRoad(featureId);
+ RoadGeometry const roadGeometry = IsFakeFeature(featureId) ? GetFakeRoadGeometry(featureId)
+ : m_graph.GetRoad(featureId);
CHECK_NOT_EQUAL(pointFrom, pointTo, ("featureId =", featureId));
uint32_t const step = pointFrom < pointTo ? 1 : -1;