diff --git a/libs/geometry/point2d.hpp b/libs/geometry/point2d.hpp index 7363a92f1..6508006b8 100644 --- a/libs/geometry/point2d.hpp +++ b/libs/geometry/point2d.hpp @@ -150,6 +150,12 @@ public: { size_t operator()(Point const & p) const { return math::Hash(p.x, p.y); } }; + + template + operator Point() const + { + return Point(x, y); + } }; using PointF = Point; diff --git a/libs/traffxml/traff_decoder.cpp b/libs/traffxml/traff_decoder.cpp index 07dba8986..ce4aa0415 100644 --- a/libs/traffxml/traff_decoder.cpp +++ b/libs/traffxml/traff_decoder.cpp @@ -624,18 +624,13 @@ double RoutingTraffDecoder::TraffEstimator::CalcOffroad(ms::LatLon const & from, * * Returns: reduced offroad weight from table, or default offroad weight if not found */ - auto const getOffroadFromJunction = [defaultWeight](ms::LatLon const & refPoint, - ms::LatLon const & roadPoint, - std::map const & junctions) + auto const getOffroadFromJunction = [defaultWeight](ms::LatLon const & refPoint, ms::LatLon const & roadPoint, + std::map const & junctions) { - m2::PointD m2RoadPoint = mercator::FromLatLon(roadPoint); + m2::PointF m2RoadPoint = mercator::FromLatLon(roadPoint); auto it = junctions.find(m2RoadPoint); if (it != junctions.end()) return it->second; - // TODO this is likely an inefficient way to return near-matches - for (auto & [point, weight] : junctions) - if (m2RoadPoint.EqualDxDy(point, kMwmPointAccuracy)) - return weight; return defaultWeight; }; @@ -1267,8 +1262,7 @@ void RoutingTraffDecoder::GetJunctionPointCandidates() } } -void RoutingTraffDecoder::GetJunctionPointCandidates(Point const & point, - std::map & junctions) +void RoutingTraffDecoder::GetJunctionPointCandidates(Point const & point, std::map & junctions) { m2::PointD const m2Point = mercator::FromLatLon(point.m_coordinates); std::map pointCandidates; @@ -1495,10 +1489,8 @@ std::vector ParseRef(std::string const & ref) return res; } -void TruncateStart(std::vector & rsegments, - routing::Checkpoints const & checkpoints, - size_t & start, double & startSaving, - std::map const & junctions) +void TruncateStart(std::vector & rsegments, routing::Checkpoints const & checkpoints, + size_t & start, double & startSaving, std::map const & junctions) { if (rsegments.empty()) return; @@ -1510,37 +1502,24 @@ void TruncateStart(std::vector & rsegments, * Examine end point of segment: for a junction, take weight from table; else calculate it as * direct distance multiplied with offroad penalty; calculate saving based on that. */ - auto it = junctions.find(rsegments[i].GetJunction().GetPoint()); + m2::PointF point = rsegments[i].GetJunction().GetPoint(); + + auto it = junctions.find(point); if (it != junctions.end()) newStartSaving = rsegments[i].GetTimeFromBeginningSec() - it->second; else - { - bool matched = false; - // TODO this is likely an inefficient way to return near-matches - for (auto & [point, weight] : junctions) - if (rsegments[i].GetJunction().GetPoint().EqualDxDy(point, kMwmPointAccuracy)) - { - newStartSaving = rsegments[i].GetTimeFromBeginningSec() - weight; - matched = true; - break; - } - if (!matched) - newStartSaving = rsegments[i].GetTimeFromBeginningSec() - - (mercator::DistanceOnEarth(checkpoints.GetStart(), rsegments[i].GetJunction().GetPoint()) - * kOffroadPenalty); - } + newStartSaving = rsegments[i].GetTimeFromBeginningSec() - + (mercator::DistanceOnEarth(checkpoints.GetStart(), point) * kOffroadPenalty); if (newStartSaving > startSaving) { - start = i + 1; // add 1 because we are ditching this segment and keeping the next one + start = i + 1; // add 1 because we are ditching this segment and keeping the next one startSaving = newStartSaving; } } } -void TruncateEnd(std::vector & rsegments, - routing::Checkpoints const & checkpoints, - size_t & end, double & endSaving, double const endWeight, - std::map const & junctions) +void TruncateEnd(std::vector & rsegments, routing::Checkpoints const & checkpoints, size_t & end, + double & endSaving, double const endWeight, std::map const & junctions) { for (size_t i = 0; i < rsegments.size(); i++) { @@ -1549,25 +1528,14 @@ void TruncateEnd(std::vector & rsegments, * Examine end point of segment: for a junction, take weight from table; else calculate it as * direct distance multiplied with offroad penalty; calculate saving based on that. */ - auto it = junctions.find(rsegments[i].GetJunction().GetPoint()); + m2::PointF point = rsegments[i].GetJunction().GetPoint(); + + auto it = junctions.find(point); if (it != junctions.end()) newEndSaving = endWeight - rsegments[i].GetTimeFromBeginningSec() - it->second; else - { - bool matched = false; - // TODO this is likely an inefficient way to return near-matches - for (auto & [point, weight] : junctions) - if (rsegments[i].GetJunction().GetPoint().EqualDxDy(point, kMwmPointAccuracy)) - { - newEndSaving = endWeight - rsegments[i].GetTimeFromBeginningSec() - weight; - matched = true; - break; - } - if (!matched) - newEndSaving = endWeight - rsegments[i].GetTimeFromBeginningSec() - - (mercator::DistanceOnEarth(rsegments[i].GetJunction().GetPoint(), checkpoints.GetFinish()) - * kOffroadPenalty); - } + newEndSaving = endWeight - rsegments[i].GetTimeFromBeginningSec() - + (mercator::DistanceOnEarth(point, checkpoints.GetFinish()) * kOffroadPenalty); if (newEndSaving > endSaving) { end = i; diff --git a/libs/traffxml/traff_decoder.hpp b/libs/traffxml/traff_decoder.hpp index 92a5a8219..09b4e9c06 100644 --- a/libs/traffxml/traff_decoder.hpp +++ b/libs/traffxml/traff_decoder.hpp @@ -507,7 +507,7 @@ private: * @param junctions Receives a list of junction candidates with their weight */ void GetJunctionPointCandidates(Point const & point, - std::map & junctions); + std::map & junctions); /** * @brief Mutex for access to shared members. @@ -530,7 +530,7 @@ private: * If the list is empty, no junction alignment at the `from` point will be done and decoding * relies solely on point coordinates. */ - std::map m_startJunctions; + std::map m_startJunctions; /** * @brief Junction points near end of location, with their associated offroad weight. @@ -538,7 +538,7 @@ private: * If the list is empty, no junction alignment at the `to` point will be done and decoding * relies solely on point coordinates. */ - std::map m_endJunctions; + std::map m_endJunctions; /** * @brief Radius around reference points in which to search for junctions. @@ -601,7 +601,7 @@ std::vector ParseRef(std::string const & ref); void TruncateStart(std::vector & rsegments, routing::Checkpoints const & checkpoints, size_t & start, double & startSaving, - std::map const & junctions); + std::map const & junctions); /** * @brief Calculates the segments to truncate at the start of the route. @@ -621,5 +621,5 @@ void TruncateStart(std::vector & rsegments, void TruncateEnd(std::vector & rsegments, routing::Checkpoints const & checkpoints, size_t & end, double & endSaving, double const endWeight, - std::map const & junctions); + std::map const & junctions); } // namespace traffxml