Files
comaps/search/projection_on_street.cpp
Konstantin Pastbin e3e4a1985a Organic Maps sources as of 02.04.2025 (fad26bbf22ac3da75e01e62aa01e5c8e11861005)
To expand with full Organic Maps and Maps.ME commits history run:
  git remote add om-historic [om-historic.git repo url]
  git fetch --tags om-historic
  git replace squashed-history historic-commits
2025-05-08 21:10:51 +07:00

54 lines
1.6 KiB
C++

#include "search/projection_on_street.hpp"
#include "geometry/mercator.hpp"
#include "geometry/robust_orientation.hpp"
#include <limits>
namespace search
{
// ProjectionOnStreet ------------------------------------------------------------------------------
ProjectionOnStreet::ProjectionOnStreet()
: m_proj(0, 0), m_distMeters(0), m_segIndex(0), m_projSign(false)
{
}
// ProjectionOnStreetCalculator --------------------------------------------------------------------
ProjectionOnStreetCalculator::ProjectionOnStreetCalculator(std::vector<m2::PointD> const & points)
{
size_t const count = points.size();
if (count < 2)
return;
m_segments.reserve(count - 1);
for (size_t i = 1; i < count; ++i)
m_segments.emplace_back(points[i - 1], points[i]);
}
bool ProjectionOnStreetCalculator::GetProjection(m2::PointD const & point,
ProjectionOnStreet & proj) const
{
size_t const kInvalidIndex = m_segments.size();
proj.m_segIndex = kInvalidIndex;
proj.m_distMeters = std::numeric_limits<double>::max();
for (size_t index = 0; index < m_segments.size(); ++index)
{
m2::PointD const ptProj = m_segments[index].ClosestPointTo(point);
double const distMeters = mercator::DistanceOnEarth(point, ptProj);
if (distMeters < proj.m_distMeters)
{
proj.m_proj = ptProj;
proj.m_distMeters = distMeters;
proj.m_segIndex = index;
proj.m_projSign =
m2::robust::OrientedS(m_segments[index].GetP0(), m_segments[index].GetP1(), point) <= 0.0;
}
}
return (proj.m_segIndex < kInvalidIndex);
}
} // namespace search