Beispiel #1
0
        public static (Node, bool) FindPath(Node targetNode, bool onCart)
        {
            var node  = GetCurrentNode();
            var graph = new Graph(State.Geo);
            var core  = GraphUtils.FindCore(graph, EdgeType.Elevator, EdgeType.Road);

            core.ForEach(cNode => cNode.AssignIsCore(true));
            var coreIds = core.Select(n => n.Id).ToList();

            GraphUtils.AssignClosestCores(graph, coreIds);

            State.CarRoadmap.Path.Clear();
            State.CarRoadmap.Position = 0;

            if (onCart)
            {
                var path      = GraphUtils.FindClosestCore(graph, targetNode.Id, coreIds);
                var targetCar = path.Target();
                if (targetCar == node.Id)
                {
                    var finalPath = GraphUtils.FindClosestWithCriteria(graph, node.Id, i => i == targetCar,
                                                                       new List <int>(), true);
                    finalPath.AddToWaypoints(State.CarRoadmap.Path);
                    return(graph.Nodes.GetValueOrDefault(finalPath.Target()), false);
                }
                else
                {
                    var finalPath = GraphUtils.FindClosestWithCriteria(graph, node.Id, i => i == targetCar,
                                                                       new List <int>(), true);
                    finalPath.AddToWaypoints(State.CarRoadmap.Path);
                    path.AddToWaypoints(State.CarRoadmap.Path, true);
                    return(graph.Nodes.GetValueOrDefault(finalPath.Target()), true);
                }
            }
            else
            {
                var path = GraphUtils.FindClosestWithCriteria(
                    graph,
                    node.Id,
                    i => i == targetNode.Id,
                    new List <int>(),
                    false
                    );
                path.AddToWaypoints(State.CarRoadmap.Path);
                return(graph.Nodes.GetValueOrDefault(path.Target()), true);
            }
        }