forked from organicmaps/organicmaps
Comparator fix to exclude unobvious behavior.
This commit is contained in:
parent
ff30928c9c
commit
78dd5ac092
4 changed files with 18 additions and 34 deletions
|
@ -74,7 +74,19 @@ IRouter::ResultCode CrossMwmGraph::SetFinalNode(CrossNode const & finalNode)
|
|||
return IRouter::RouteNotFound;
|
||||
|
||||
for (auto j = mwmIngoingIter.first; j != mwmIngoingIter.second; ++j)
|
||||
{
|
||||
// Case with a target node at the income mwm node.
|
||||
if (j->m_nodeId == finalNode.node)
|
||||
{
|
||||
CrossNode start(j->m_nodeId, finalNode.mwmName,
|
||||
MercatorBounds::FromLatLon(j->m_point.y, j->m_point.x));
|
||||
vector<CrossWeightedEdge> dummyEdges;
|
||||
dummyEdges.emplace_back(BorderCross(finalNode, finalNode), 0 /* no weight */);
|
||||
m_virtualEdges.insert(make_pair(start, dummyEdges));
|
||||
return IRouter::NoError;
|
||||
}
|
||||
sources.emplace_back(j->m_nodeId, true /* isStartNode */, finalNode.mwmName);
|
||||
}
|
||||
vector<EdgeWeight> weights;
|
||||
|
||||
targets[0] = FeatureGraphNode(finalNode.node, false /* isStartNode */, finalNode.mwmName);
|
||||
|
@ -199,15 +211,7 @@ void ConvertToSingleRouterTasks(vector<BorderCross> const & graphCrosses,
|
|||
if (route.empty())
|
||||
return;
|
||||
|
||||
// Starts of virtual nodes are always present because they are not compaired in A* algo.
|
||||
route.front().startNode = startGraphNode;
|
||||
|
||||
// Stop point lays on out edge, and we have no virtual edge to unpack.
|
||||
if (route.back().startNode.mwmName != finalGraphNode.mwmName)
|
||||
route.emplace_back(graphCrosses.back().toNode.node,
|
||||
graphCrosses.back().toNode.node,
|
||||
graphCrosses.back().toNode.mwmName);
|
||||
|
||||
route.back().finalNode = finalGraphNode;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,9 +20,10 @@ struct CrossNode
|
|||
NodeID node;
|
||||
string mwmName;
|
||||
m2::PointD point;
|
||||
bool isVirtual;
|
||||
|
||||
CrossNode(NodeID node, string const & mwmName, m2::PointD const & point)
|
||||
: node(node), mwmName(mwmName), point(point)
|
||||
: node(node), mwmName(mwmName), point(point), isVirtual(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -32,13 +33,15 @@ struct CrossNode
|
|||
|
||||
inline bool operator==(CrossNode const & a) const
|
||||
{
|
||||
return node == a.node && mwmName == a.mwmName;
|
||||
return node == a.node && mwmName == a.mwmName && isVirtual == a.isVirtual;
|
||||
}
|
||||
|
||||
inline bool operator<(CrossNode const & a) const
|
||||
{
|
||||
if (a.node != node)
|
||||
return node < a.node;
|
||||
if(isVirtual != a.isVirtual)
|
||||
return isVirtual < a.isVirtual;
|
||||
return mwmName < a.mwmName;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -74,6 +74,7 @@ IRouter::ResultCode CalculateCrossMwmPath(TRoutingNodes const & startGraphNodes,
|
|||
for (FeatureGraphNode const & final : finalGraphNodes)
|
||||
{
|
||||
finalNode = CrossNode(final.node.reverse_node_id, final.mwmName, final.segmentPoint);
|
||||
finalNode.isVirtual = true;
|
||||
code = roadGraph.SetFinalNode(finalNode);
|
||||
if (code == IRouter::NoError)
|
||||
{
|
||||
|
|
|
@ -37,30 +37,6 @@ UNIT_TEST(TestCrossRouteConverter)
|
|||
("End node must be replaced by origin."));
|
||||
}
|
||||
|
||||
UNIT_TEST(TestCrossRouteConverterEdgeCase)
|
||||
{
|
||||
vector<BorderCross> graphCrosses;
|
||||
CrossNode const a(1, "aMap", {0, 0}), b(2, "aMap", {2, 2});
|
||||
CrossNode const c(3, "bMap", {3, 3});
|
||||
graphCrosses.emplace_back(a, b);
|
||||
graphCrosses.emplace_back(b, c);
|
||||
FeatureGraphNode startGraphNode;
|
||||
startGraphNode.node.forward_node_id = 5;
|
||||
startGraphNode.mwmName = "aMap";
|
||||
FeatureGraphNode finalGraphNode;
|
||||
finalGraphNode.node.reverse_node_id = 6;
|
||||
finalGraphNode.mwmName = "bMap";
|
||||
TCheckedPath route;
|
||||
ConvertToSingleRouterTasks(graphCrosses, startGraphNode, finalGraphNode, route);
|
||||
TEST_EQUAL(route.size(), 2, ("We have 2 maps aMap and bMap."));
|
||||
for (auto const & r : route)
|
||||
TEST_EQUAL(r.startNode.mwmName, r.finalNode.mwmName, ());
|
||||
TEST_EQUAL(route.front().startNode.node, startGraphNode.node,
|
||||
("Start node must be replaced by origin."));
|
||||
TEST_EQUAL(route.back().finalNode.node, finalGraphNode.node,
|
||||
("End node must be replaced by origin."));
|
||||
}
|
||||
|
||||
// Cross routing context tests.
|
||||
UNIT_TEST(TestContextSerialization)
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue