예제 #1
0
    // Only used in the prefabs when generating the local grid -- the prefab uses a grid layout,
    // so this works there just fine.
    public void AddAllNeighborsToGridNode(int row, int col, int width, int height)
    {
        for (int i = -1; i < 2; ++i)
        {
            for (int j = -1; j < 2; ++j)
            {
                int nodeX = (row + j);
                int nodeY = (col + i);

                if ((i == 0) && (j == 0))
                {
                    continue;
                }

                if (IsWithinBounds(nodeX, nodeY))
                {
                    int nodeIdx = col * width + row;

                    var node = m_sparseGraph.GetNode(nodeIdx);

                    if (node == null || node.NodeIndex == (int)ENodeType.InvalidNodeIndex)
                    {
                        continue;
                    }

                    var neighborNode = m_sparseGraph.GetNode(nodeY * width + nodeX);

                    if (neighborNode == null || neighborNode.NodeIndex == (int)ENodeType.InvalidNodeIndex || neighborNode.nodeType == NodeType.Blocked)
                    {
                        continue;
                    }

                    var pos         = new Vector3(node.position.x, node.position.y, node.position.z);
                    var neighborPos = new Vector3(neighborNode.position.x, neighborNode.position.y, neighborNode.position.z);

                    double distance = Vector3.Distance(pos, neighborPos);
                    var    newEdge  = new GraphEdge(node.NodeIndex, neighborNode.NodeIndex, distance);

                    m_sparseGraph.AddEdge(newEdge);

                    if (!m_sparseGraph.IsDigraph())
                    {
                        UnityEdge Edge = new UnityEdge(neighborNode.NodeIndex, node.NodeIndex, distance);
                        m_sparseGraph.AddEdge(Edge);
                    }
                }
            }
        }
    }
예제 #2
0
        public void AddAllNeighborsToGridNode(int Row, int Col, int CellsX, int CellsY)
        {
            for (int i = -1; i < 2; ++i)
            {
                for (int j = -1; j < 2; ++j)
                {
                    int NodeX = (Col + j);
                    int NodeY = (Row + i);

                    if ((i == 0) && (j == 0))
                    {
                        continue;
                    }

                    if (ValidNeighbor(NodeX, NodeY, CellsX, CellsY))
                    {
                        var Node = (UnityNode)Graph.GetNode(Row * CellsX + Col);

                        if (Node.NodeIndex == -(int)ENodeType.InvalidNodeIndex)
                        {
                            continue;
                        }

                        var NeighborNode = (UnityNode)Graph.GetNode(NodeY * CellsX + NodeX);

                        if (NeighborNode.NodeIndex == (int)ENodeType.InvalidNodeIndex)
                        {
                            continue;
                        }

                        var PosNode         = new Vector3(Node.X, 1, Node.Y);
                        var PosNeighborNode = new Vector3(NeighborNode.X, 1, NeighborNode.Y);

                        double Distance = Vector3.Distance(PosNode, PosNeighborNode);
                        var    NewEdge  = new UnityEdge(Node.NodeIndex, NeighborNode.NodeIndex, Distance);

                        Graph.AddEdge(NewEdge);

                        if (!Graph.IsDigraph())
                        {
                            UnityEdge Edge = new UnityEdge(NeighborNode.NodeIndex, Node.NodeIndex, Distance);
                            Graph.AddEdge(Edge);
                        }
                    }
                }
            }
        }