From 9b7a703295ab02f5feafdfe35851387775efbf80 Mon Sep 17 00:00:00 2001 From: Constantin Shalnev Date: Tue, 28 Jul 2015 11:58:18 +0300 Subject: [PATCH] Added GetJunctionTypes function --- routing/features_road_graph.cpp | 34 ++++++++++++++++++++ routing/features_road_graph.hpp | 1 + routing/road_graph.hpp | 3 ++ routing/routing_tests/road_graph_builder.cpp | 6 ++++ routing/routing_tests/road_graph_builder.hpp | 1 + 5 files changed, 45 insertions(+) diff --git a/routing/features_road_graph.cpp b/routing/features_road_graph.cpp index c564591993..3d743c737f 100644 --- a/routing/features_road_graph.cpp +++ b/routing/features_road_graph.cpp @@ -43,6 +43,12 @@ MwmSet::MwmHandle GetMwmHandleByMwmId(Index & index, MwmSet::MwmId const & mwmId string const countryName = mwmId.GetInfo()->GetCountryName(); return index.GetMwmHandleByCountryFile(platform::CountryFile(countryName)); } + +inline bool PointsAlmostEqualAbs(const m2::PointD & pt1, const m2::PointD & pt2) +{ + double constexpr kEpsilon = 1e-6; + return my::AlmostEqualAbs(pt1.x, pt2.x, kEpsilon) && my::AlmostEqualAbs(pt1.y, pt2.y, kEpsilon); +} } // namespace @@ -207,6 +213,34 @@ void FeaturesRoadGraph::GetFeatureTypes(FeatureID const & featureId, feature::Ty types = feature::TypesHolder(ft); } +void FeaturesRoadGraph::GetJunctionTypes(Junction const & junction, feature::TypesHolder & types) const +{ + types = feature::TypesHolder(); + + m2::PointD const & cross = junction.GetPoint(); + + auto const f = [&types, &cross](FeatureType & ft) + { + if (!types.Empty()) + return; + + if (ft.GetFeatureType() != feature::GEOM_POINT) + return; + + if (!PointsAlmostEqualAbs(ft.GetCenter(), cross)) + return; + + feature::TypesHolder typesHolder(ft); + if (!typesHolder.Empty()) + types = typesHolder; + }; + + m_index.ForEachInRect(f, + m2::RectD(cross.x - kReadCrossEpsilon, cross.y - kReadCrossEpsilon, + cross.x + kReadCrossEpsilon, cross.y + kReadCrossEpsilon), + GetStreetReadScale()); +} + void FeaturesRoadGraph::ClearState() { m_cache.Clear(); diff --git a/routing/features_road_graph.hpp b/routing/features_road_graph.hpp index a9c395d1b0..ae0576647c 100644 --- a/routing/features_road_graph.hpp +++ b/routing/features_road_graph.hpp @@ -69,6 +69,7 @@ public: void FindClosestEdges(m2::PointD const & point, uint32_t count, vector> & vicinities) const override; void GetFeatureTypes(FeatureID const & featureId, feature::TypesHolder & types) const override; + void GetJunctionTypes(Junction const & junction, feature::TypesHolder & types) const override; void ClearState() override; private: diff --git a/routing/road_graph.hpp b/routing/road_graph.hpp index 9cf1377edf..e606fecbc6 100644 --- a/routing/road_graph.hpp +++ b/routing/road_graph.hpp @@ -155,6 +155,9 @@ public: /// @return Types for the specified edge void GetEdgeTypes(Edge const & edge, feature::TypesHolder & types) const; + /// @return Types for specified junction + virtual void GetJunctionTypes(Junction const & junction, feature::TypesHolder & types) const = 0; + /// Clear all temporary buffers. virtual void ClearState() {} diff --git a/routing/routing_tests/road_graph_builder.cpp b/routing/routing_tests/road_graph_builder.cpp index 28fdfe0e9b..73e329c431 100644 --- a/routing/routing_tests/road_graph_builder.cpp +++ b/routing/routing_tests/road_graph_builder.cpp @@ -104,6 +104,12 @@ void RoadGraphMockSource::GetFeatureTypes(FeatureID const & featureId, feature:: UNUSED_VALUE(types); } +void RoadGraphMockSource::GetJunctionTypes(Junction const & junction, feature::TypesHolder & types) const +{ + UNUSED_VALUE(junction); + UNUSED_VALUE(types); +} + FeatureID MakeTestFeatureID(uint32_t offset) { static TestValidFeatureIDProvider instance; diff --git a/routing/routing_tests/road_graph_builder.hpp b/routing/routing_tests/road_graph_builder.hpp index 5dcf0c0ba7..9501c9f4ed 100644 --- a/routing/routing_tests/road_graph_builder.hpp +++ b/routing/routing_tests/road_graph_builder.hpp @@ -21,6 +21,7 @@ public: void FindClosestEdges(m2::PointD const & point, uint32_t count, vector> & vicinities) const override; void GetFeatureTypes(FeatureID const & featureId, feature::TypesHolder & types) const override; + void GetJunctionTypes(routing::Junction const & junction, feature::TypesHolder & types) const override; private: vector m_roads;