Revert "[tracks] Fixed starting points."

This reverts commit fda1da03c8.
This commit is contained in:
Konstantin Pastbin
2025-08-31 15:58:45 +07:00
parent 2dce119370
commit 165e844308
2 changed files with 35 additions and 28 deletions

View File

@@ -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<location::GpsInfo> 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;
}

View File

@@ -2,6 +2,9 @@
#include "platform/location.hpp"
#include "geometry/latlon.hpp"
#include <cstddef>
#include <vector>
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;