前段时间有个客户说他们想在我们的3D的机房中找从A点到B点的最短路径,然而在2D中确实有很多成熟的寻路算法,其中A*是最为常见的,而这个Demo也是用的A*算法,以下计算的是从左上角到右下角的最短路径:
具体的实现方式是,先将地板进行了分割,分成一个数组,然后再计算该点上是否有3D的对象,若是有,就置成该点不能通过的标记,否则就表示该点可以通过(如果你分割的越细那么算的就越精确,但是算的当然也就慢一些,关键看你的要求),以下是分割地板的代码:
1 |
var size = {x: 100, y: 100}; // 100*100
|
2 |
var topLeft = {x: 228, y: 53};
|
3 |
var width = 524;
|
4 |
var height = 400;
|
5 | var dw = width / size.x; |
6 | var dh = height / size.y; |
7 | var start; |
8 | var end; |
9 | var graph; |
10 | function to2d() { |
11 |
var nodes = [];
|
12 |
for (var i = 0; i < size.x; i++) {
|
13 |
var nodeRow = [];
|
14 |
var x = topLeft.x + dw * i
|
15 |
for (var j = 0; j < size.y; j++) {
|
16 |
var y = topLeft.y + dh * j;
|
17 |
if (isHasObj(x, y)) { //判断该点上是否有物体
|
18 |
nodeRow.push(0);
|
19 |
} else {
|
20 |
nodeRow.push(1);
|
21 |
}
|
22 |
}
|
23 |
nodes.push(nodeRow);
|
24 |
}
|
25 |
graph = new Graph(nodes, {
|
26 |
closest: null,
|
27 |
diagonal: false
|
28 |
});
|
29 |
30 |
//这里是找一条从(0,0)到(79,80)的路径。
|
31 |
start = graph.grid[0][0];
|
32 |
drawPath(79, 80);
|
33 | } |

本文介绍了如何使用A*算法在3D机房环境中找到从A点到B点的最短路径。通过将地板分割为数组,并标记每个点是否可以通行,实现路径的有效计算。重点展示了分割地板的代码实现及如何应用A*算法找到从左上角到右下角的最短路径。
3080

被折叠的 条评论
为什么被折叠?



