From 30e24efaeab14f58ab23f193b90ed2ed04744e7e Mon Sep 17 00:00:00 2001 From: Daria Volvenkova Date: Wed, 18 Mar 2020 13:32:10 +0300 Subject: [PATCH] [bookmarks] Review fixes. --- map/bookmark_manager.cpp | 24 +++++++++++------------- map/track.cpp | 21 +++++++++++---------- map/track.hpp | 2 +- map/track_mark.hpp | 2 +- 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index cce306501b..f3d7ce47f0 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -1097,7 +1097,7 @@ void BookmarkManager::SetElevationActivePoint(kml::TrackId const & trackId, doub CHECK(track != nullptr, ()); m2::PointD pt; - CHECK(track->GetPoint(targetDistance, pt), (trackId, targetDistance)); + VERIFY(track->GetPoint(targetDistance, pt), (trackId, targetDistance)); SelectTrack(TrackSelectionInfo(trackId, pt, targetDistance)); } @@ -1155,18 +1155,16 @@ BookmarkManager::TrackSelectionInfo BookmarkManager::FindNearestTrack( m2::ParametrizedSegment seg(pt1, pt2); auto const closestPoint = seg.ClosestPointTo(touchRect.Center()); auto const squaredDist = closestPoint.SquaredLength(touchRect.Center()); - if (squaredDist < minSquaredDist) - { - minSquaredDist = squaredDist; - selectionInfo.m_trackId = trackId; - selectionInfo.m_trackPoint = closestPoint; + if (squaredDist >= minSquaredDist) + continue; - auto const segDistInMeters = mercator::DistanceOnEarth(pointsWithAlt[i].GetPoint(), - closestPoint); - selectionInfo.m_distanceInMeters = segDistInMeters; - if (i > 0) - selectionInfo.m_distanceInMeters += track->GetLengthMeters(i - 1); - } + minSquaredDist = squaredDist; + selectionInfo.m_trackId = trackId; + selectionInfo.m_trackPoint = closestPoint; + + auto const segDistInMeters = mercator::DistanceOnEarth(pointsWithAlt[i].GetPoint(), + closestPoint); + selectionInfo.m_distanceInMeters = segDistInMeters + track->GetLengthMeters(i); } } } @@ -1244,7 +1242,7 @@ void BookmarkManager::ShowDefaultTrackInfo(kml::TrackId trackId) auto const & points = track->GetPointsWithAltitudes(); auto const pt = points[points.size() / 2].GetPoint(); - auto const distance = track->GetLengthMeters(points.size() / 2 - 1); + auto const distance = track->GetLengthMeters(points.size() / 2); auto es = GetEditSession(); auto trackInfoMark = es.GetMarkForEdit(m_trackInfoMarkId); diff --git a/map/track.cpp b/map/track.cpp index a244f28b85..26918b1a7e 100644 --- a/map/track.cpp +++ b/map/track.cpp @@ -20,15 +20,16 @@ void Track::CacheLengthsAndLimitRect() { m_cachedLimitRect.MakeEmpty(); m_cachedLimitRect.Add(m_data.m_pointsWithAltitudes.front().GetPoint()); - m_cachedLengths.resize(m_data.m_pointsWithAltitudes.size() - 1); + m_cachedLengths.resize(m_data.m_pointsWithAltitudes.size()); double length = 0.0; + m_cachedLengths[0] = 0.0; for (size_t i = 1; i < m_data.m_pointsWithAltitudes.size(); ++i) { auto const & pt1 = m_data.m_pointsWithAltitudes[i - 1].GetPoint(); auto const & pt2 = m_data.m_pointsWithAltitudes[i].GetPoint(); auto const segmentLength = mercator::DistanceOnEarth(pt1, pt2); length += segmentLength; - m_cachedLengths[i - 1] = length; + m_cachedLengths[i] = length; m_cachedLimitRect.Add(pt2); } } @@ -48,10 +49,10 @@ double Track::GetLengthMeters() const return m_cachedLengths.back(); } -double Track::GetLengthMeters(size_t segmentIndex) const +double Track::GetLengthMeters(size_t pointIndex) const { - CHECK_LESS(segmentIndex, m_cachedLengths.size(), (segmentIndex)); - return m_cachedLengths[segmentIndex]; + CHECK_LESS(pointIndex, m_cachedLengths.size(), (pointIndex, m_cachedLengths.size())); + return m_cachedLengths[pointIndex]; } df::DepthLayer Track::GetDepthLayer() const @@ -116,7 +117,7 @@ bool Track::GetPoint(double distanceInMeters, m2::PointD & pt) const { CHECK_GREATER_OR_EQUAL(distanceInMeters, 0.0, (distanceInMeters)); - if (distanceInMeters == 0.0) + if (fabs(distanceInMeters - m_cachedLengths.front()) < 1e-2) { pt = m_data.m_pointsWithAltitudes.front().GetPoint(); return true; @@ -132,14 +133,14 @@ bool Track::GetPoint(double distanceInMeters, m2::PointD & pt) const if (it == m_cachedLengths.end()) return false; - auto const segmentIndex = it - m_cachedLengths.begin(); + auto const pointIndex = std::distance(m_cachedLengths.begin(), it); auto const length = *it; - auto const segmentLength = length - (segmentIndex == 0 ? 0.0 : m_cachedLengths[segmentIndex - 1]); + auto const segmentLength = length - m_cachedLengths[pointIndex - 1]; auto const k = (segmentLength - (length - distanceInMeters)) / segmentLength; - auto const & pt1 = m_data.m_pointsWithAltitudes[segmentIndex].GetPoint(); - auto const & pt2 = m_data.m_pointsWithAltitudes[segmentIndex + 1].GetPoint(); + auto const & pt1 = m_data.m_pointsWithAltitudes[pointIndex - 1].GetPoint(); + auto const & pt2 = m_data.m_pointsWithAltitudes[pointIndex].GetPoint(); pt = pt1 + (pt2 - pt1) * k; return true; diff --git a/map/track.hpp b/map/track.hpp index 4f1be78c93..dfd200da36 100644 --- a/map/track.hpp +++ b/map/track.hpp @@ -22,7 +22,7 @@ public: std::string GetName() const; m2::RectD const & GetLimitRect() const; double GetLengthMeters() const; - double GetLengthMeters(size_t segmentIndex) const; + double GetLengthMeters(size_t pointIndex) const; int GetMinZoom() const override { return 1; } df::DepthLayer GetDepthLayer() const override; diff --git a/map/track_mark.hpp b/map/track_mark.hpp index 3f9cb7fa1a..515b76c21f 100644 --- a/map/track_mark.hpp +++ b/map/track_mark.hpp @@ -31,7 +31,7 @@ private: class TrackSelectionMark : public UserMark { public: - double static constexpr kInvalidDistance = -1.0; + static double constexpr kInvalidDistance = -1.0; explicit TrackSelectionMark(m2::PointD const & ptOrg);