From fc00ee4d41d772204ff60debc3bf5f798549e1ea Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Thu, 22 Oct 2015 17:57:55 +0300 Subject: [PATCH] Tree index for cross section index finding. --- routing/cross_mwm_road_graph.cpp | 25 +++++++++++-------------- routing/cross_routing_context.cpp | 16 ++++++++++++++++ routing/cross_routing_context.hpp | 7 +++++++ 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/routing/cross_mwm_road_graph.cpp b/routing/cross_mwm_road_graph.cpp index 49e55c1d55..62f084bb51 100644 --- a/routing/cross_mwm_road_graph.cpp +++ b/routing/cross_mwm_road_graph.cpp @@ -131,22 +131,19 @@ BorderCross CrossMwmGraph::FindNextMwmNode(OutgoingCrossNode const & startNode, return BorderCross(); nextMapping->LoadCrossContext(); - auto incomeIters = nextMapping->m_crossContext.GetIngoingIterators(); - for (auto i = incomeIters.first; i < incomeIters.second; ++i) + IngoingCrossNode ingoingNode; + if (nextMapping->m_crossContext.FindIngoingNodeByPoint(startPoint, ingoingNode)) { - m2::PointD const & targetPoint = i->m_point; - if (ms::DistanceOnEarth(startPoint.y, startPoint.x, targetPoint.y, targetPoint.x) < - kMwmCrossingNodeEqualityRadiusMeters) - { - BorderCross const cross( - CrossNode(startNode.m_nodeId, currentMapping->GetCountryName(), - MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x)), - CrossNode(i->m_nodeId, nextMwm, - MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x))); - m_cachedNextNodes.insert(make_pair(startPoint, cross)); - return cross; - } + auto const & targetPoint = ingoingNode.m_point; + BorderCross const cross( + CrossNode(startNode.m_nodeId, currentMapping->GetCountryName(), + MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x)), + CrossNode(ingoingNode.m_nodeId, nextMwm, + MercatorBounds::FromLatLon(targetPoint.y, targetPoint.x))); + m_cachedNextNodes.insert(make_pair(startPoint, cross)); + return cross; } + return BorderCross(); } diff --git a/routing/cross_routing_context.cpp b/routing/cross_routing_context.cpp index 317b854631..3e9e439ea8 100644 --- a/routing/cross_routing_context.cpp +++ b/routing/cross_routing_context.cpp @@ -1,5 +1,6 @@ #include "routing/cross_routing_context.hpp" +#include "indexer/mercator.hpp" #include "indexer/point_to_int64.hpp" namespace routing @@ -65,7 +66,10 @@ void CrossRoutingContextReader::Load(Reader const & r) m_ingoingNodes.resize(size); for (auto & node : m_ingoingNodes) + { pos = node.Load(r, pos); + m_ingoingIndex.Add(node); + } r.Read(pos, &size, sizeof(size)); pos += sizeof(size); @@ -92,6 +96,18 @@ void CrossRoutingContextReader::Load(Reader const & r) } } +bool CrossRoutingContextReader::FindIngoingNodeByPoint(m2::PointD const & point, IngoingCrossNode & node) const +{ + bool found = false; + m_ingoingIndex.ForEachInRect(MercatorBounds::RectByCenterXYAndSizeInMeters(point, 5), + [&found, &node](IngoingCrossNode const & nd) + { + node = nd; + found = true; + }); + return found; +} + const string & CrossRoutingContextReader::GetOutgoingMwmName( OutgoingCrossNode const & outgoingNode) const { diff --git a/routing/cross_routing_context.hpp b/routing/cross_routing_context.hpp index 8daa188348..87b0d5e29c 100644 --- a/routing/cross_routing_context.hpp +++ b/routing/cross_routing_context.hpp @@ -3,6 +3,8 @@ #include "coding/file_container.hpp" #include "geometry/point2d.hpp" +#include "geometry/rect2d.hpp" +#include "geometry/tree4d.hpp" #include "std/string.hpp" #include "std/vector.hpp" @@ -25,6 +27,8 @@ struct IngoingCrossNode void Save(Writer & w) const; size_t Load(Reader const & r, size_t pos); + + m2::RectD const GetLimitRect() const { return m2::RectD(m_point, m_point); } }; struct OutgoingCrossNode @@ -53,6 +57,7 @@ class CrossRoutingContextReader vector m_outgoingNodes; vector m_neighborMwmList; unique_ptr mp_reader = nullptr; + m4::Tree m_ingoingIndex; size_t GetIndexInAdjMatrix(IngoingEdgeIteratorT ingoing, OutgoingEdgeIteratorT outgoing) const; @@ -63,6 +68,8 @@ public: pair GetIngoingIterators() const; + bool FindIngoingNodeByPoint(m2::PointD const & point, IngoingCrossNode & node) const; + pair GetOutgoingIterators() const; WritedEdgeWeightT GetAdjacencyCost(IngoingEdgeIteratorT ingoing,