diff --git a/routing/index_graph_starter.hpp b/routing/index_graph_starter.hpp index 3ae981d196..5754cf642c 100644 --- a/routing/index_graph_starter.hpp +++ b/routing/index_graph_starter.hpp @@ -47,11 +47,12 @@ public: bool Fits(Segment const & segment) const { - bool const softFits = segment.GetMwmId() == m_segment.GetMwmId() && - segment.GetFeatureId() == m_segment.GetFeatureId() && - segment.GetSegmentIdx() == m_segment.GetSegmentIdx(); - return m_soft ? softFits : softFits && m_segment.IsForward() == segment.IsForward(); + if (!m_soft) + return segment == m_segment; + return segment.GetMwmId() == m_segment.GetMwmId() && + segment.GetFeatureId() == m_segment.GetFeatureId() && + segment.GetSegmentIdx() == m_segment.GetSegmentIdx(); } uint32_t GetSegmentIdxForTesting() const { return m_segment.GetSegmentIdx(); } @@ -59,6 +60,11 @@ public: private: Segment m_segment; m2::PointD const m_point; + // If |m_soft| == true it means that |m_segment| should be used as a two way segment. So it's + // possible to go along |m_segment| in any direction. In that case the instanse of FakeVertex + // could be considered as a soft FakeVertex. + // If |m_soft| == true it means it's possible to go along |m_segment| only in direction according + // to its |m_forward| parameter. bool const m_soft; }; @@ -77,6 +83,7 @@ public: FakeVertex const & GetStartVertex() const { return m_start; } FakeVertex const & GetFinishVertex() const { return m_finish; } m2::PointD const & GetPoint(Segment const & segment, bool front); + bool FitsStart(Segment const & s) const { return m_start.Fits(s); } bool FitsFinish(Segment const & s) const { return m_finish.Fits(s); } static size_t GetRouteNumPoints(vector const & route); diff --git a/routing/index_road_graph.cpp b/routing/index_road_graph.cpp index 9f063bd0ce..328a1c4f82 100644 --- a/routing/index_road_graph.cpp +++ b/routing/index_road_graph.cpp @@ -99,8 +99,13 @@ void IndexRoadGraph::GetEdges(Junction const & junction, bool isOutgoing, TEdgeV m2::PointD IndexRoadGraph::GetJunctionPoint(Segment const & segment, bool front) const { - return front && m_starter.FitsFinish(segment) ? m_starter.GetFinishVertex().GetPoint() - : m_starter.GetPoint(segment, front); + if (!front && m_starter.FitsStart(segment)) + return m_starter.GetStartVertex().GetPoint(); + + if (front && m_starter.FitsFinish(segment)) + return m_starter.GetFinishVertex().GetPoint(); + + return m_starter.GetPoint(segment, front); } Junction IndexRoadGraph::GetJunction(Segment const & segment, bool front) const