diff --git a/android/jni/com/mapswithme/maps/LocationState.cpp b/android/jni/com/mapswithme/maps/LocationState.cpp index 3de0696689..eaed74f0c4 100644 --- a/android/jni/com/mapswithme/maps/LocationState.cpp +++ b/android/jni/com/mapswithme/maps/LocationState.cpp @@ -3,13 +3,13 @@ #include "../core/jni_helper.hpp" +location::State * GetLocationState() +{ + return g_framework->NativeFramework()->GetLocationState().get(); +} + extern "C" { - shared_ptr const & GetLocationState() - { - return g_framework->NativeFramework()->GetLocationState(); - } - JNIEXPORT void JNICALL Java_com_mapswithme_maps_LocationState_switchToNextMode(JNIEnv * env, jobject thiz) { diff --git a/indexer/indexer_tests/mercator_test.cpp b/indexer/indexer_tests/mercator_test.cpp index a641435118..3fa787247a 100644 --- a/indexer/indexer_tests/mercator_test.cpp +++ b/indexer/indexer_tests/mercator_test.cpp @@ -60,15 +60,15 @@ UNIT_TEST(Mercator_ErrorToRadius) double const lat = points[j]; m2::PointD const mercPoint(MercatorBounds::LonToX(lon), MercatorBounds::LatToY(lat)); - m2::RectD radius1 = MercatorBounds::MetresToXY(lon, lat, error1); + m2::RectD const radius1 = MercatorBounds::MetresToXY(lon, lat, error1); TEST(radius1.IsPointInside(mercPoint), (lat, lon)); + TEST(radius1.Center().EqualDxDy(mercPoint, 1.0E-8), ()); - m2::RectD radius10 = MercatorBounds::MetresToXY(lon, lat, error10); + m2::RectD const radius10 = MercatorBounds::MetresToXY(lon, lat, error10); TEST(radius10.IsPointInside(mercPoint), (lat, lon)); + TEST(radius10.Center().EqualDxDy(mercPoint, 1.0E-8), ()); - m2::RectD radius10Added = radius10; - radius10Added.Add(radius1); - TEST_EQUAL(radius10, radius10Added, (lat, lon)); + TEST_EQUAL(m2::Add(radius10, radius1), radius10, (lat, lon)); TEST(radius10.IsPointInside(radius1.LeftTop()), (lat, lon)); TEST(radius10.IsPointInside(radius1.LeftBottom()), (lat, lon)); diff --git a/map/framework.cpp b/map/framework.cpp index 763616f4dd..0e17e7abd3 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -1126,7 +1126,7 @@ bool Framework::Search(search::SearchParams const & params) bool Framework::GetCurrentPosition(double & lat, double & lon) const { - shared_ptr locationState = m_informationDisplay.locationState(); + shared_ptr const & locationState = m_informationDisplay.locationState(); if (locationState->IsModeHasPosition()) { @@ -1135,7 +1135,8 @@ bool Framework::GetCurrentPosition(double & lat, double & lon) const lon = MercatorBounds::XToLon(pos.x); return true; } - else return false; + else + return false; } void Framework::ShowSearchResult(search::Result const & res) diff --git a/map/routing_session.cpp b/map/routing_session.cpp index 0bf94d3213..3fe2dccd5b 100644 --- a/map/routing_session.cpp +++ b/map/routing_session.cpp @@ -64,7 +64,7 @@ RoutingSession::State RoutingSession::OnLocationPositionChanged(m2::PointD const ASSERT(m_route.IsValid(), ()); - if (m_route.MoveIterator(position, info)) + if (m_route.MoveIterator(info)) { m_moveAwayCounter = 0; m_lastDistance = 0.0; diff --git a/routing/route.cpp b/routing/route.cpp index 96c82a96ed..2d6bf879f5 100644 --- a/routing/route.cpp +++ b/routing/route.cpp @@ -66,7 +66,7 @@ double Route::GetCurrentDistanceToEnd() const GetDistanceOnEarth(m_current.m_pt, m_poly.GetPoint(m_current.m_ind + 1))); } -bool Route::MoveIterator(m2::PointD const & currPos, location::GpsInfo const & info) const +bool Route::MoveIterator(location::GpsInfo const & info) const { double predictDistance = -1.0; if (m_currentTime > 0.0 && info.HasSpeed()) @@ -78,9 +78,11 @@ bool Route::MoveIterator(m2::PointD const & currPos, location::GpsInfo const & i predictDistance = info.m_speed * deltaT; } - IterT const res = FindProjection(currPos, - max(ON_ROAD_TOLERANCE_M, info.m_horizontalAccuracy), - predictDistance); + m2::RectD const rect = MercatorBounds::MetresToXY( + info.m_latitude, info.m_longitude, + max(ON_ROAD_TOLERANCE_M, info.m_horizontalAccuracy)); + + IterT const res = FindProjection(rect, predictDistance); if (res.IsValid()) { m_current = res; @@ -102,27 +104,23 @@ bool Route::IsCurrentOnEnd() const return (GetCurrentDistanceToEnd() < ON_END_TOLERANCE_M); } -Route::IterT Route::FindProjection(m2::PointD const & currPos, - double errorRadius, - double predictDistance) const +Route::IterT Route::FindProjection(m2::RectD const & posRect, double predictDistance) const { ASSERT(m_current.IsValid(), ()); ASSERT_LESS(m_current.m_ind, m_poly.GetSize() - 1, ()); - ASSERT_GREATER(errorRadius, 0.0, ()); - - m2::RectD const rect = MercatorBounds::RectByCenterXYAndSizeInMeters(currPos, errorRadius); IterT res; if (predictDistance >= 0.0) { - res = GetClosestProjection(currPos, rect, [&] (IterT const & it) + res = GetClosestProjection(posRect, [&] (IterT const & it) { return fabs(GetDistanceOnPolyline(m_current, it) - predictDistance); }); } else { - res = GetClosestProjection(currPos, rect, [&] (IterT const & it) + m2::PointD const currPos = posRect.Center(); + res = GetClosestProjection(posRect, [&] (IterT const & it) { return GetDistanceOnEarth(it.m_pt, currPos); }); @@ -177,19 +175,18 @@ void Route::Update() } template -Route::IterT Route::GetClosestProjection(m2::PointD const & currPos, - m2::RectD const & rect, - DistanceF const & distFn) const +Route::IterT Route::GetClosestProjection(m2::RectD const & posRect, DistanceF const & distFn) const { IterT res; double minDist = numeric_limits::max(); + m2::PointD const currPos = posRect.Center(); size_t const count = m_poly.GetSize() - 1; for (size_t i = m_current.m_ind; i < count; ++i) { m2::PointD const pt = m_segProj[i](currPos); - if (!rect.IsPointInside(pt)) + if (!posRect.IsPointInside(pt)) continue; IterT it(pt, i); diff --git a/routing/route.hpp b/routing/route.hpp index 837edc5134..876a09b3b7 100644 --- a/routing/route.hpp +++ b/routing/route.hpp @@ -57,7 +57,7 @@ public: //@} /// @return true If position was updated successfully (projection within gps error radius). - bool MoveIterator(m2::PointD const & currPos, location::GpsInfo const & info) const; + bool MoveIterator(location::GpsInfo const & info) const; /// Square distance to current projection in mercator. double GetCurrentSqDistance(m2::PointD const & pt) const; @@ -65,16 +65,11 @@ public: bool IsCurrentOnEnd() const; private: - /// @param[in] errorRadius Radius to check projection candidates (meters). /// @param[in] predictDistance Predict distance from previous FindProjection call (meters). - IterT FindProjection(m2::PointD const & currPos, - double errorRadius, - double predictDistance = -1.0) const; + IterT FindProjection(m2::RectD const & posRect, double predictDistance = -1.0) const; template - IterT GetClosestProjection(m2::PointD const & currPos, - m2::RectD const & rect, - DistanceF const & distFn) const; + IterT GetClosestProjection(m2::RectD const & posRect, DistanceF const & distFn) const; double GetDistanceOnPolyline(IterT const & it1, IterT const & it2) const;