| 99 | } |
| 100 | |
| 101 | void ExpandFake(Graph::EdgeVector & path, Graph::EdgeVector::iterator edgeIt, DataSource const & dataSource, Graph & g) |
| 102 | { |
| 103 | if (!edgeIt->IsFake()) |
| 104 | return; |
| 105 | |
| 106 | Graph::EdgeListT edges; |
| 107 | bool startIsFake = true; |
| 108 | if (IsRealVertex(edgeIt->GetStartPoint(), edgeIt->GetFeatureId(), dataSource)) |
| 109 | { |
| 110 | g.GetRegularOutgoingEdges(edgeIt->GetStartJunction(), edges); |
| 111 | startIsFake = false; |
| 112 | } |
| 113 | else |
| 114 | { |
| 115 | ASSERT(IsRealVertex(edgeIt->GetEndPoint(), edgeIt->GetFeatureId(), dataSource), ()); |
| 116 | g.GetRegularIngoingEdges(edgeIt->GetEndJunction(), edges); |
| 117 | } |
| 118 | |
| 119 | CHECK(!edges.empty(), ()); |
| 120 | |
| 121 | auto it = find_if(begin(edges), end(edges), [&edgeIt](Graph::Edge const & real) |
| 122 | { |
| 123 | if (real.GetFeatureId() == edgeIt->GetFeatureId() && real.GetSegId() == edgeIt->GetSegId()) |
| 124 | return true; |
| 125 | return false; |
| 126 | }); |
| 127 | |
| 128 | // For features which cross mwm border FeatureIds may not match. Check geometry. |
| 129 | if (it == end(edges)) |
| 130 | { |
| 131 | it = find_if(begin(edges), end(edges), [&edgeIt, &startIsFake](Graph::Edge const & real) |
| 132 | { |
| 133 | // Features from the same mwm should be already matched. |
| 134 | if (real.GetFeatureId().m_mwmId == edgeIt->GetFeatureId().m_mwmId) |
| 135 | return false; |
| 136 | |
| 137 | auto const fakePoint = startIsFake ? edgeIt->GetStartPoint() : edgeIt->GetEndPoint(); |
| 138 | m2::ParametrizedSegment<m2::PointD> const realGeometry(real.GetStartPoint(), real.GetEndPoint()); |
| 139 | auto const projectedPoint = realGeometry.ClosestPointTo(fakePoint); |
| 140 | |
| 141 | auto constexpr kCrossMwmMatchDistanceM = 1.0; |
| 142 | if (mercator::DistanceOnEarth(fakePoint, projectedPoint) < kCrossMwmMatchDistanceM) |
| 143 | return true; |
| 144 | return false; |
| 145 | }); |
| 146 | } |
| 147 | |
| 148 | CHECK(it != end(edges), ()); |
| 149 | |
| 150 | // If a fake edge is larger than a half of the corresponding real one, substitute |
| 151 | // the fake one with real one. Drop the fake one otherwize. |
| 152 | if (2 * EdgeLength(*edgeIt) >= EdgeLength(*it)) |
| 153 | *edgeIt = *it; |
| 154 | else |
| 155 | path.erase(edgeIt); |
| 156 | } |
| 157 | |
| 158 | void ExpandFakes(DataSource const & dataSource, Graph & g, Graph::EdgeVector & path) |
no test coverage detected