前段时间有个客户说他们想在我们的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 | } |