Esempio n. 1
0
        private RoadNode GetFirstNode(Waypoint startWp)
        {
            RoadNode node = new RoadNode(startWp);

            node.GetNexts();
            return(node);
        }
Esempio n. 2
0
 public void Add(RoadNode newNode)
 {
     if (!newNode.beenAddedToGraph)
     {
         nodes.Add(newNode);
         newNode.beenAddedToGraph = true;
         numOfNodes++;
         newNode.id = numOfNodes;
     }
 }
Esempio n. 3
0
 public RoadEdge NodeToEdge(RoadNode target)
 {
     foreach (RoadEdge edge in nextEdges)
     {
         if (edge.to == target)
         {
             return(edge);
         }
     }
     return(null);
 }
        public RoadEdge[] Djikstra(Waypoint start, Waypoint target)
        {
            // Find some explanations here: https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/
            ResetGraph();
            RoadNode startingNode = ClosestFrom(start);
            RoadNode endNode      = ClosestFrom(target);

            startingNode.minDist     = 0f;
            startingNode.minDistFrom = null;


            // Hash function just returns node id. Wastes some memory, but quick to implement
            RoadNode[] checkedList = new RoadNode[graph.nodes.Count];
            SimplePriorityQueue <RoadNode> priorityQueue = new SimplePriorityQueue <RoadNode>();

            foreach (RoadNode node in graph.nodes)
            {
                priorityQueue.Enqueue(node, node.minDist);
            }

            bool stopCondition = GetStopCondition(checkedList, endNode);

            while (!stopCondition)
            {
                RoadNode checkedNode = priorityQueue.Dequeue();
                checkedList[checkedNode.id] = checkedNode;
                for (int i = 0; i < checkedNode.nexts.Count; i++)
                {
                    if (checkedNode.minDist + checkedNode.nextEdges[i].weight < checkedNode.nexts[i].minDist)
                    {
                        checkedNode.nexts[i].minDist     = checkedNode.minDist + checkedNode.nextEdges[i].weight;
                        checkedNode.nexts[i].minDistFrom = checkedNode.nextEdges[i];
                    }
                }
                stopCondition = GetStopCondition(checkedList, endNode);
            }

            List <RoadEdge> reversePath = new List <RoadEdge>();
            RoadNode        currentRoad = endNode;

            while (currentRoad.minDist != 0)
            {
                reversePath.Add(currentRoad.minDistFrom);
                currentRoad = currentRoad.minDistFrom.from;
            }

            RoadEdge[] path = reversePath.ToArray();

            Array.Reverse(path, 0, path.Length);


            return(path);
        }
Esempio n. 5
0
        private void AssignNexts(Waypoint[] paths)
        {
            foreach (Waypoint path in paths)
            {
                Waypoint[] waypointsToNearestNext = ClosestNodableWaypoint(path);
                Waypoint   nextWaypoint           = waypointsToNearestNext[waypointsToNearestNext.Length - 1];
                if (nextWaypoint != null)
                {
                    if (nextWaypoint.graphNode == null)
                    {
                        RoadNode next = new RoadNode(nextWaypoint);
                        nextWaypoint.graphNode = next;
                    }
                    nexts.Add(nextWaypoint.graphNode);
                    nextWaypoint.graphNode.prevs.Add(this);

                    RoadEdge edge = new RoadEdge(this, nextWaypoint.graphNode, waypointsToNearestNext);
                    nextEdges.Add(edge);
                    nextWaypoint.graphNode.prevEdges.Add(edge);
                }
            }
        }
 private bool GetStopCondition(RoadNode[] chckedList, RoadNode target)
 {
     return(chckedList[target.id] == target);
 }