private bool IsOpen(AStarGridNode node) { IEnumerator enumerator = mOpenTable.GetEnumerator(); try { while (enumerator.MoveNext()) { AStarGridNode current = (AStarGridNode)enumerator.Current; if (current.Equals(node)) { return(true); } } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable == null) { } disposable.Dispose(); } return(false); }
/// <summary> /// 构建路径信息 /// </summary> private void BuildPath() { Path.Clear(); for (AStarGridNode node = Grid.EndNode; false == node.Equals(Grid.StartNode); node = node.ParentNode) { Path.Add(node); } }
private bool Search() { AStarGridNode startNode = Grid.StartNode; // 还没有遍历到最后一个节点 while (false == startNode.Equals(Grid.EndNode)) { int num = (int)Math.Max((float)0f, (float)(startNode.Position.x - 1f)); int num2 = (int)Math.Min((float)(Grid.NumCols - 1), startNode.Position.x + 1f); int num3 = (int)Math.Max((float)0f, (float)(startNode.Position.y - 1f)); int num4 = (int)Math.Min((float)(Grid.NumRows - 1), startNode.Position.y + 1f); for (int i = num; i <= num2; i++) { for (int j = num3; j <= num4; j++) { AStarGridNode nodeAtPosition = Grid.GetNodeAtPosition(i, j); // 剔除重复的节点 if (false == nodeAtPosition.Equals(startNode) && nodeAtPosition.Walkable) { double straightCost = mStraightCost; if ((startNode.Position.x != nodeAtPosition.Position.x) && (startNode.Position.y != nodeAtPosition.Position.y)) { straightCost = mDiagonalCost; } double num8 = startNode.G + (straightCost * nodeAtPosition.Cost); double heruistic = GetHeruistic(nodeAtPosition); double num10 = num8 + heruistic; // 已经在open或者close表中 if (IsOpen(nodeAtPosition) || IsClosed(nodeAtPosition)) { if (nodeAtPosition.F > num10) { nodeAtPosition.F = num10; nodeAtPosition.G = num8; nodeAtPosition.H = heruistic; nodeAtPosition.ParentNode = startNode; } } // 不在这些表中 else { nodeAtPosition.F = num10; nodeAtPosition.G = num8; nodeAtPosition.H = heruistic; nodeAtPosition.ParentNode = startNode; mOpenTable.Add(nodeAtPosition); } } } } // 已经走过该节点 mClosedTable.Add(startNode); // 检查是否没有需要走的节点了 if (mOpenTable.Count == 0) { return(false); } // 排序open表提高效率 mOpenTable.Sort(new AStarComparer()); // 获取第一个节点然后从open表中删除 startNode = (AStarGridNode)mOpenTable[0]; mOpenTable.RemoveAt(0); } BuildPath(); return(true); }