public Stack <NavArea2D> GetPath(NavArea2D start, NavArea2D goal)
    {
        int maxIterations = 2000;

        List <NavArea2DNode> openNodes   = new List <NavArea2DNode>();
        List <NavArea2DNode> closedNodes = new List <NavArea2DNode>();

        NavArea2DNode startNode = new NavArea2DNode(start);
        NavArea2DNode goalNode  = new NavArea2DNode(goal);
        NavArea2DNode current   = startNode;

        openNodes.Add(current);
        while (maxIterations > 0 && openNodes.Count > 0 && (closedNodes.Contains(goalNode) == false))
        {
            maxIterations--;
            current = openNodes[0];
            openNodes.Remove(current);
            closedNodes.Add(current);

            List <NavArea2DNode> neighbors = current.GetNeighbors();
            foreach (NavArea2DNode neighbor in neighbors)
            {
                if (closedNodes.Contains(neighbor) == false)
                {
                    if (openNodes.Contains(neighbor) == false)
                    {
                        neighbor.parent = current;
                        // TODO: Improve this Distance function to consider more relevant values
                        neighbor.distanceToTarget = neighbor.DistanceTo(goalNode);
                        neighbor.cost             = neighbor.weight + neighbor.parent.cost;
                        openNodes.Add(neighbor);
                        openNodes = openNodes.OrderBy(node => node.F).ToList();
                    }
                }
            }
        }

        if (closedNodes.Contains(goalNode) == false)
        {
            return(null);
        }

        NavArea2DNode temp = current;

        if (closedNodes.Contains(current) == false)
        {
            return(null);
        }

        Stack <NavArea2D> path = new Stack <NavArea2D>();

        do
        {
            path.Push(temp.area);
            temp = temp.parent;
        } while (temp != startNode && temp != null);

        return(path);
    }
 public float DistanceTo(NavArea2DNode node)
 {
     return(area.DistanceTo(node.area));
 }