Как я могу построить путь между двумя удаленными узлами в pathfinding3d.js? - PullRequest
0 голосов
/ 18 ноября 2018

Чтобы создать путь в pathfinding3d.js, мы должны добавить все узлы и их соседей.

var nodes = [
    new PF.Node(0,0,0),
    new PF.Node(1,0,0),
    new PF.Node(2,0,0),
];
nodes[0].neighbors.push(nodes[1]);
nodes[1].neighbors.push(nodes[0],nodes[2]);
nodes[2].neighbors.push(nodes[1]);
var finder = new PF.AStarFinder();
var path = finder.findPath(nodes[0], nodes[2], nodes);

Проблема в том, что если я хочу создать большую трехмерную сетку узла, создатьпуть Мне нужно нажать соседа в каждом узле, чтобы создать путь.Есть ли другой способ сделать это?Могу ли я создать путь от одной точки к другой, просто добавив исходный узел и конечный узел?Такие как createPath (node ​​(1,2,3), node (4,5,6) и путь между ними создают путь. Или есть другое решение, более подходящее, чем это?

1 Ответ

0 голосов
/ 06 мая 2019

Мне удалось найти решение.Сначала я создаю три функции, которые помогут мне создать макет, подключить все узлы, а затем сделать только необходимый узел, подключенный с помощью pathfinding3d.js, чтобы вычислить, какой узел ему необходимо подключить, на основе предложенных подключенных узлов.Вот функция:

function create3DLayout(x, y, z) {
    let layout = new Array(x);
    for (let i = 0; i < x; i++) {
        layout[i] = new Array(y);
        for (let j = 0; j < y; j++) {
            layout[i][j] = new Array(z);
            for (let k = 0; k < z; k++) {
                layout[i][j][k] = new PF.Node(i, j, k);
            }
        }
    }
    return layout;
}

function createAllWalkable(layout) {
    for (let i = 0; i < layout.length; i++) {
        for (let j = 0; j < layout[i].length; j++) {
            for (let k = 0; k < layout[i][j].length; k++) {

                let mInit = (i + -1 >= 0) ? -1 : 0;
                let mEnd = (i + 1 < layout.length) ? 1 : 0;

                for (let m = mInit; m <= mEnd; m++) {

                    let nInit = (j + -1 >= 0) ? -1 : 0;
                    let nEnd = (j + 1 < layout[i].length) ? 1 : 0;

                    for (let n = nInit; n <= nEnd; n++) {

                        let oInit = (k + -1 >= 0) ? -1 : 0;
                        let oEnd = (k + 1 < layout[i][j].length) ? 1 : 0;

                        for (let o = oInit; o <= oEnd; o++) {

                            let xt = m + i;
                            let yt = n + j;
                            let zt = o + k;

                            if (layout[xt][yt][zt] != layout[i][j][k]) {
                                layout[i][j][k].neighbors.push(layout[xt][yt][zt]);
                            }
                        }
                    }
                }
            }
        }
    }
}

function createWalkablePath(layout, nodeStart, nodeEnd) {
    // Create building
    let walkablelayout = create3DLayout(layout.length, layout[0].length, layout[0][0].length);

    // Create path to every corner of building
    createAllWalkable(walkablelayout);

    let startPath = walkablelayout[nodeStart.x][nodeStart.y][nodeStart.z];
    let endPath = walkablelayout[nodeEnd.x][nodeEnd.y][nodeEnd.z];

    let explorer = new PF.AStarFinder();
    let exploredPath = explorer.findPath(startPath, endPath, walkablelayout);

    for (let i = 0; i < exploredPath.length - 1; i++) {
        layout[exploredPath[i][0]][exploredPath[i][1]][exploredPath[i][2]].neighbors.push(layout[exploredPath[i + 1][0]][exploredPath[i + 1][1]][exploredPath[i + 1][2]]);
        layout[exploredPath[i + 1][0]][exploredPath[i + 1][1]][exploredPath[i + 1][2]].neighbors.push(layout[exploredPath[i][0]][exploredPath[i][1]][exploredPath[i][2]]);
    }

}

Затем я сделаю расчет:

var nodes = create3DLayout(26, 26, 3);

        createWalkablePath(nodes, nodes[7][14][0], nodes[9][17][0]);
        createWalkablePath(nodes, nodes[0][0][0], nodes[25][25][2]);
        createWalkablePath(nodes, nodes[0][25][0], nodes[9][17][0]);
        createWalkablePath(nodes, nodes[1][15][1], nodes[9][17][0]);
        createWalkablePath(nodes, nodes[20][25][1], nodes[9][17][0]);

        // Create finder
        var finder = new PF.AStarFinder();

        // origin
        var startNode = nodes[14][14][2];
        console.log(startNode);

        // Destination
        var endNode = nodes[17][17][2];
        console.log(endNode);

        var path;

        // Find path
        path = finder.findPath(startNode, endNode, nodes);
        console.log(path);

Надеюсь, это поможет любому, кто сталкивается с той же проблемой.

...