diff --git a/libs/map/gps_track_filter.cpp b/libs/map/gps_track_filter.cpp index 0e47508cb..16eaec3ed 100644 --- a/libs/map/gps_track_filter.cpp +++ b/libs/map/gps_track_filter.cpp @@ -6,6 +6,8 @@ #include "platform/settings.hpp" #include "base/assert.hpp" +#include "base/macros.hpp" +#include "base/math.hpp" namespace { @@ -78,34 +80,37 @@ void GpsTrackFilter::Process(std::vector const & inPoints, if (!currInfo.HasSpeed()) continue; - if (m_countAcceptedInfo == 0 || (IsGoodPoint(currInfo) && (m_countLastInfo < 2 || IsGoodVector(currInfo)))) + if (m_countAcceptedInfo < 2 || currInfo.m_timestamp < GetLastAcceptedInfo().m_timestamp) { - outPoints.emplace_back(currInfo); + AddLastInfo(currInfo); AddLastAcceptedInfo(currInfo); + continue; + } + + if (IsGoodPoint(currInfo)) + { + double const predictionDistance = GetDistance(m_lastInfo[1], m_lastInfo[0]); // meters + double const realDistance = GetDistance(m_lastInfo[0], currInfo); // meters + + m2::PointD const predictionDirection = GetDirection(m_lastInfo[1], m_lastInfo[0]); + m2::PointD const realDirection = GetDirection(m_lastInfo[0], currInfo); + + // Cosine of angle between prediction direction and real direction is + double const cosine = m2::DotProduct(predictionDirection, realDirection); + + // Acceptable angle must be from 0 to 45 or from 0 to -45. + // Acceptable distance must be not great than 2x than predicted, otherwise it is jump. + if (cosine >= kCosine45degrees && realDistance <= std::max(kClosePointDistanceMeters, 2. * predictionDistance)) + { + outPoints.emplace_back(currInfo); + AddLastAcceptedInfo(currInfo); + } } AddLastInfo(currInfo); } } -bool GpsTrackFilter::IsGoodVector(location::GpsInfo const & info) const -{ - ASSERT_GREATER(m_countLastInfo, 1, ()); - - double const predictionDistance = GetDistance(m_lastInfo[1], m_lastInfo[0]); // meters - double const realDistance = GetDistance(m_lastInfo[0], info); // meters - - m2::PointD const predictionDirection = GetDirection(m_lastInfo[1], m_lastInfo[0]); - m2::PointD const realDirection = GetDirection(m_lastInfo[0], info); - - // Cosine of angle between prediction direction and real direction is - double const cosine = m2::DotProduct(predictionDirection, realDirection); - - // Acceptable angle must be from 0 to 45 or from 0 to -45. - // Acceptable distance must be not great than 2x than predicted, otherwise it is jump. - return (cosine >= kCosine45degrees && realDistance <= std::max(kClosePointDistanceMeters, 2. * predictionDistance)); -} - bool GpsTrackFilter::IsGoodPoint(location::GpsInfo const & info) const { // Filter by point accuracy @@ -115,11 +120,6 @@ bool GpsTrackFilter::IsGoodPoint(location::GpsInfo const & info) const auto const & lastInfo = GetLastInfo(); auto const & lastAcceptedInfo = GetLastAcceptedInfo(); - // Time spend to move from the last point to the current point, sec: - double const timeFromLast = info.m_timestamp - lastInfo.m_timestamp; - if (timeFromLast <= 0.0) - return false; - // Distance in meters between last accepted and current point is, meters: double const distanceFromLastAccepted = GetDistance(lastAcceptedInfo, info); @@ -135,6 +135,11 @@ bool GpsTrackFilter::IsGoodPoint(location::GpsInfo const & info) const // Distance in meters between last and current point is, meters: double const distanceFromLast = GetDistance(lastInfo, info); + // Time spend to move from the last point to the current point, sec: + double const timeFromLast = info.m_timestamp - lastInfo.m_timestamp; + if (timeFromLast <= 0.0) + return false; + // Speed to move from the last point to the current point double const speedFromLast = distanceFromLast / timeFromLast; @@ -162,12 +167,12 @@ void GpsTrackFilter::AddLastInfo(location::GpsInfo const & info) { m_lastInfo[1] = m_lastInfo[0]; m_lastInfo[0] = info; - ++m_countLastInfo; + m_countLastInfo += 1; } void GpsTrackFilter::AddLastAcceptedInfo(location::GpsInfo const & info) { m_lastAcceptedInfo[1] = m_lastAcceptedInfo[0]; m_lastAcceptedInfo[0] = info; - ++m_countAcceptedInfo; + m_countAcceptedInfo += 1; } diff --git a/libs/map/gps_track_filter.hpp b/libs/map/gps_track_filter.hpp index 1308eeb6d..f31109943 100644 --- a/libs/map/gps_track_filter.hpp +++ b/libs/map/gps_track_filter.hpp @@ -2,6 +2,9 @@ #include "platform/location.hpp" +#include "geometry/latlon.hpp" + +#include #include class IGpsTrackFilter @@ -32,7 +35,6 @@ public: private: bool IsGoodPoint(location::GpsInfo const & info) const; - bool IsGoodVector(location::GpsInfo const & info) const; location::GpsInfo const & GetLastInfo() const; location::GpsInfo const & GetLastAcceptedInfo() const;