diff --git a/routing/base/followed_polyline.cpp b/routing/base/followed_polyline.cpp index 6b36d62036..d95aff2de6 100644 --- a/routing/base/followed_polyline.cpp +++ b/routing/base/followed_polyline.cpp @@ -2,13 +2,25 @@ namespace routing { -namespace -{ -double constexpr kPedestrianEdgeSwitchMeters = 5.0; -} // namespace -double FollowedPolyline::GetDistanceOnPolyline(Iter const & it1, Iter const & it2) const +using Iter = routing::FollowedPolyline::Iter; + +Iter FollowedPolyline::Begin() const { + ASSERT(IsValid(), ()); + return Iter(m_poly.Front(), 0); +} + +Iter FollowedPolyline::End() const +{ + ASSERT(IsValid(), ()); + return Iter(m_poly.Back(), m_poly.GetSize() - 1); +} + +// TODO (ldragunov) Write tests for this code. +double FollowedPolyline::GetDistanceM(Iter const & it1, Iter const & it2) const +{ + ASSERT(IsValid(), ()); ASSERT(it1.IsValid() && it2.IsValid(), ()); ASSERT_LESS_OR_EQUAL(it1.m_ind, it2.m_ind, ()); ASSERT_LESS(it1.m_ind, m_poly.GetSize(), ()); @@ -55,7 +67,7 @@ void FollowedPolyline::Update() } template -FollowedPolyline::Iter FollowedPolyline::GetClosestProjection(m2::RectD const & posRect, +Iter FollowedPolyline::GetClosestProjection(m2::RectD const & posRect, DistanceFn const & distFn) const { Iter res; @@ -82,7 +94,7 @@ FollowedPolyline::Iter FollowedPolyline::GetClosestProjection(m2::RectD const & return res; } -FollowedPolyline::Iter FollowedPolyline::UpdateProjectionByPrediction(m2::RectD const & posRect, +Iter FollowedPolyline::UpdateProjectionByPrediction(m2::RectD const & posRect, double predictDistance) const { ASSERT(m_current.IsValid(), ()); @@ -94,7 +106,7 @@ FollowedPolyline::Iter FollowedPolyline::UpdateProjectionByPrediction(m2::RectD Iter res; res = GetClosestProjection(posRect, [&](Iter const & it) { - return fabs(GetDistanceOnPolyline(m_current, it) - predictDistance); + return fabs(GetDistanceM(m_current, it) - predictDistance); }); if (res.IsValid()) @@ -102,7 +114,7 @@ FollowedPolyline::Iter FollowedPolyline::UpdateProjectionByPrediction(m2::RectD return res; } -FollowedPolyline::Iter FollowedPolyline::UpdateProjection(m2::RectD const & posRect) const +Iter FollowedPolyline::UpdateProjection(m2::RectD const & posRect) const { ASSERT(m_current.IsValid(), ()); ASSERT_LESS(m_current.m_ind, m_poly.GetSize() - 1, ()); @@ -119,30 +131,6 @@ FollowedPolyline::Iter FollowedPolyline::UpdateProjection(m2::RectD const & posR return res; } -double FollowedPolyline::GetTotalDistanceMeters() const -{ - ASSERT(!m_segDistance.empty(), ()); - return m_segDistance.back(); -} - -double FollowedPolyline::GetCurrentDistanceFromBeginMeters() const -{ - ASSERT(m_current.IsValid(), ()); - - return ((m_current.m_ind > 0 ? m_segDistance[m_current.m_ind - 1] : 0.0) + - MercatorBounds::DistanceOnEarth(m_poly.GetPoint(m_current.m_ind), m_current.m_pt)); -} - -double FollowedPolyline::GetCurrentDistanceToEndMeters() const -{ - ASSERT(m_current.IsValid(), ()); - ASSERT_LESS(m_current.m_ind, m_segDistance.size(), ()); - - return (m_segDistance.back() - m_segDistance[m_current.m_ind] + - MercatorBounds::DistanceOnEarth(m_current.m_pt, m_poly.GetPoint(m_current.m_ind + 1))); -} - - double FollowedPolyline::GetMercatorDistanceFromBegin() const { double distance = 0.0; diff --git a/routing/base/followed_polyline.hpp b/routing/base/followed_polyline.hpp index b4e3f0d69f..7b788a124f 100644 --- a/routing/base/followed_polyline.hpp +++ b/routing/base/followed_polyline.hpp @@ -24,12 +24,6 @@ public: m2::PolylineD const & GetPolyline() const { return m_poly; } - double GetTotalDistanceMeters() const; - - double GetCurrentDistanceFromBeginMeters() const; - - double GetCurrentDistanceToEndMeters() const; - double GetMercatorDistanceFromBegin() const; void GetCurrentDirectionPoint(m2::PointD & pt) const @@ -50,9 +44,14 @@ public: const Iter GetCurrentIter() const { return m_current; } + double GetDistanceM(Iter const & it1, Iter const & it2) const; + Iter UpdateProjectionByPrediction(m2::RectD const & posRect, double predictDistance) const; Iter UpdateProjection(m2::RectD const & posRect) const; + Iter Begin() const; + Iter End() const; + //TODO (ldragunov) remove this by updating iterator vector const & GetSegDistances() const { return m_segDistance; } @@ -62,8 +61,6 @@ private: void Update(); - double GetDistanceOnPolyline(Iter const & it1, Iter const & it2) const; - m2::PolylineD m_poly; /// Cached result iterator for last MoveIterator query. diff --git a/routing/route.cpp b/routing/route.cpp index 82102a3f35..32a626b132 100644 --- a/routing/route.cpp +++ b/routing/route.cpp @@ -49,13 +49,13 @@ void Route::Swap(Route & rhs) double Route::GetTotalDistanceMeters() const { ASSERT(m_poly.IsValid(), ()); - return m_poly.GetTotalDistanceMeters(); + return m_poly.GetDistanceM(m_poly.Begin(), m_poly.End()); } double Route::GetCurrentDistanceFromBeginMeters() const { ASSERT(m_poly.IsValid(), ()); - return m_poly.GetCurrentDistanceFromBeginMeters(); + return m_poly.GetDistanceM(m_poly.Begin(), m_poly.GetCurrentIter()); } void Route::GetTurnsDistances(vector & distances) const @@ -82,7 +82,7 @@ void Route::GetTurnsDistances(vector & distances) const double Route::GetCurrentDistanceToEndMeters() const { - return m_poly.GetCurrentDistanceToEndMeters(); + return m_poly.GetDistanceM(m_poly.GetCurrentIter(), m_poly.End()); } double Route::GetMercatorDistanceFromBegin() const @@ -245,7 +245,7 @@ void Route::MatchLocationToRoute(location::GpsInfo & location, location::RouteMa bool Route::IsCurrentOnEnd() const { - return (m_poly.GetCurrentDistanceToEndMeters() < kOnEndToleranceM); + return (m_poly.GetDistanceM(m_poly.GetCurrentIter(), m_poly.End()) < kOnEndToleranceM); } void Route::Update()