Esempio n. 1
0
            private static void IdentifySuccessors(IMapData Map, NavigationNode Node, INode Goal, NavigationNodeStack OpenedNodes, NavigationNodeStack ClosedNodes)
            {
                INode[] neighbors = GetNeighbors(Map, Node);

                for (int i = 0; i < neighbors.Length; ++i)
                {
                    INode neighborNode = neighbors[i];

                    INode jumpNode = Jump(Map, neighborNode, Node.Node, Goal, OpenedNodes);

                    if (jumpNode == null || IsNavigationNodeInList(jumpNode, ClosedNodes))
                    {
                        continue;
                    }

                    NavigationNode jumpNavNode = GetNavigationNode(jumpNode, OpenedNodes);

                    bool alreadyIsInOpenNodes = (jumpNavNode != null);

                    if (jumpNavNode == null)
                    {
                        jumpNavNode = GetOrAddNavigationNode(jumpNode, OpenedNodes);
                    }

                    Number heuristic     = NavigationNode.CalculateHeuristicCost(Node.Node, jumpNode);
                    Number nextExactCost = Node.ExactCost + heuristic;

                    if (!alreadyIsInOpenNodes || nextExactCost < jumpNavNode.ExactCost)
                    {
                        jumpNavNode.SetExactCost(nextExactCost);
                        jumpNavNode.SetHeuristicCost(jumpNavNode.HeuristicCost != 0 ? jumpNavNode.HeuristicCost : NavigationNode.CalculateHeuristicCost(jumpNode, Goal));
                        jumpNavNode.SetParent(Node);
                    }
                }
            }