From 32ed39c61adf93834f70a1c535170dc9e7c85ad3 Mon Sep 17 00:00:00 2001 From: Martin Asprusten Date: Sat, 5 Jul 2025 17:33:25 +0200 Subject: [PATCH] Fix one-way restriction when doing reverse search --- native/route_search.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/native/route_search.cpp b/native/route_search.cpp index ab7c7ac..cc2e691 100644 --- a/native/route_search.cpp +++ b/native/route_search.cpp @@ -24,7 +24,8 @@ struct Connection { uint8_t speedLimit; bool motorway; bool tunnel; - bool againstOneWay; + bool passableSameDirection; + bool passableOppositeDirection; }; struct RoadNode{ @@ -124,7 +125,7 @@ float getFloatFromBuffer(char* buffer) { return *((float*) &correctByteOrder); } -void addLinkToRoadNode(RoadNode* roadNodes, uint32_t nodeFrom, uint32_t nodeTo, uint8_t speedLimit, bool motorway, bool tunnel, bool againstOneWay) { +void addLinkToRoadNode(RoadNode* roadNodes, uint32_t nodeFrom, uint32_t nodeTo, uint8_t speedLimit, bool motorway, bool tunnel, bool passableSameDirection, bool passableOppositeDirection) { float fromX = roadNodes[nodeFrom].positionX; float fromY = roadNodes[nodeFrom].positionY; float toX = roadNodes[nodeTo].positionX; @@ -140,7 +141,8 @@ void addLinkToRoadNode(RoadNode* roadNodes, uint32_t nodeFrom, uint32_t nodeTo, connection.speedLimit = speedLimit; connection.motorway = motorway; connection.tunnel = tunnel; - connection.againstOneWay = againstOneWay; + connection.passableSameDirection = passableSameDirection; + connection.passableOppositeDirection = passableOppositeDirection; if (roadNodes[nodeFrom].connectionOne.connectedPointNumber == -1) { roadNodes[nodeFrom].connectionOne = connection; @@ -209,8 +211,8 @@ void loadData(std::string filePath) { bool passableSameDirection = (flagsByte & 0x04) > 0; bool passableOppositeDirection = (flagsByte & 0x08) > 0; - addLinkToRoadNode(set.roadNodes, fromPoint, toPoint, speedLimit, motorway, tunnel, !passableSameDirection); - addLinkToRoadNode(set.roadNodes, toPoint, fromPoint, speedLimit, motorway, tunnel, !passableOppositeDirection); + addLinkToRoadNode(set.roadNodes, fromPoint, toPoint, speedLimit, motorway, tunnel, passableSameDirection, passableOppositeDirection); + addLinkToRoadNode(set.roadNodes, toPoint, fromPoint, speedLimit, motorway, tunnel, passableOppositeDirection, passableSameDirection); } delete[] buffer; @@ -399,7 +401,14 @@ SearchResult findAllPathsFromPoint(int startingNode, float minimumSpeed, float m continue; } - if (neighbour.againstOneWay && ! allowAgainstOneway) { + bool againstOneWay; + if (reverse) { + againstOneWay = !neighbour.passableOppositeDirection; + } else { + againstOneWay = !neighbour.passableSameDirection; + } + + if (!allowAgainstOneway && againstOneWay) { continue; } @@ -758,7 +767,7 @@ std::vector findPossibleStartNodes(float minimumSpeed, float maximumSp if (connection.tunnel && !allowTunnels) { continue; } - if (connection.againstOneWay && !allowAgainstOneway) { + if (!connection.passableSameDirection && !allowAgainstOneway) { continue; }