Пример #1
0
        static bool TryAdvanceThroughJunction(Junction junction, RoadNetworkDescription network,
                                              ref TraversalState state, bool allowLooping = false)
        {
            var roadId = state.RoadId.ToString();

            // TODO: This search currently terminates on the first found linked road/lane, but we may want to find
            //       all of them first and then select one based on some criteria
            foreach (var connection in junction.connections)
            {
                if (roadId == connection.incomingRoadId)
                {
                    if (!allowLooping && state.AllRoadIds.HasBeenTraversed(new NativeString64(connection.incomingRoadId)))
                    {
                        return(false);
                    }

                    foreach (var link in connection.laneLinks)
                    {
                        if (link.laneIdFrom != state.LaneId)
                        {
                            continue;
                        }
                        var direction = DetermineNewDirection(connection.contactPoint);
                        var idx       = direction == TraversalDirection.Forward
                            ? 0
                            : network.GetRoadById(connection.connectingRoadId).laneSections.Count - 1;
                        state.SetNewLocation(new NativeString64(connection.connectingRoadId), idx, link.laneIdTo, direction);
                        return(true);
                    }
                }
                else if (roadId == connection.connectingRoadId)
                {
                    if (!allowLooping && state.AllRoadIds.HasBeenTraversed(new NativeString64(connection.connectingRoadId)))
                    {
                        return(false);
                    }

                    foreach (var link in connection.laneLinks)
                    {
                        if (link.laneIdTo != state.LaneId)
                        {
                            continue;
                        }
                        var nextRoad   = network.GetRoadById(connection.incomingRoadId);
                        var sectionIdx = nextRoad.laneSections.Count - 1;
                        state.SetNewLocation(new NativeString64(connection.incomingRoadId), sectionIdx, link.laneIdFrom, TraversalDirection.Backward);
                        return(true);
                    }
                }
            }

            return(false);
        }
Пример #2
0
        // Each non-junction road is effectively a segment of a graph edge - this function identifies which roads
        // belong on the same edge as the input graph edge and return the information necessary to query this edge
        internal static RoadGroup IdentifyGraphEdgeGroup(RoadNetworkDescription roadNetwork,
                                                         TraversalState state, NativeString64 roadId)
        {
            if (roadNetwork.GetRoadById(roadId).junction != "-1")
            {
                throw new ArgumentException(
                          "Cannot collect graph edge group for a road inside a junction - roads inside junctions" +
                          "are part of a graph node.");
            }

            // Because we want to limit traversal to this graph edge, we will always stop at junctions (nodes)
            const bool stopAtJunctions = true;
            var        param           = new TraversalParameters(roadNetwork, stopAtJunctions);
            // Count how many Road elements are in this group, including the starting road
            var numRoads = 1;

            state.SetNewLocation(roadId, 0, 0, TraversalDirection.Backward);
            while (TryAdvanceOneRoad(param, state))
            {
                numRoads++;
            }
            // We've moved all the way to the "front" of this collection of roads - store it as the starting location
            var startingRoadId = state.RoadId;
            // To get from the first Road to the second, we need to travel in the opposite direction we traversed to
            // reach the first Road
            var startDirection = (TraversalDirection)(-(int)state.Direction);

            // Traverse forward to ensure we mark all the roads in this group as traversed
            state.SetNewLocation(roadId, 0, 0, TraversalDirection.Forward);
            while (TryAdvanceOneRoad(param, state))
            {
                numRoads++;
            }

            return(new RoadGroup(startDirection, startingRoadId, numRoads));
        }
Пример #3
0
        // NOTE: Because this method advances by ROAD, any LANE information will be lost on traversal (reset to 0)
        //       Use TryAdvanceOneLaneSection to move along a selected lane
        internal static bool TryAdvanceOneRoad(TraversalParameters traversalParam, TraversalState traversalState)
        {
            var roadCurrent = traversalParam.roadNetwork.GetRoadById(traversalState.RoadId);
            var link        = GetLinkToNextRoad(roadCurrent, traversalState.Direction);


            if (link.linkType == RoadLinkType.None || traversalParam.shouldStopAtJunctions &&
                !IsLinkOnGraphEdge(traversalParam.roadNetwork, link))
            {
                return(false);
            }

            var directionNext = DetermineNewDirection(link.contactPoint);

            traversalState.SetNewLocation(new NativeString64(link.nodeId), 0, 0, directionNext);
            return(true);
        }