threejs 管子_threejs 组成的3d管道,寻最短路径问题

本文探讨了在ThreeJS的3D管道场景中寻找从A点到B点最短路径的问题。通过简化问题并应用寻路算法,作者发现原始算法存在缺陷,可能导致递归深度超过限制。为解决此问题,添加了递归深度检查。最后,展示了如何使用该算法找到两个指定点之间的最短路径。
摘要由CSDN通过智能技术生成

threejs 里面的3d管道的每个节点ID是唯一的,且对应x,y,z坐标。那么当需要从A点到B点的时候,可能出现有多条路径可走,此时便需要求出最短行走路径,因此用到一个寻路径算法。我们将问题简化如下:

后记:事实证明,下面这个算法有点缺陷,哈哈,其实少了一个查找深度,否则路径多的情况下会死掉,chrome dev会报 over max stack ~~ so, 加上一个递归深度就搞定了撒~~

var begId = 191; //起点ID

var endId = 185; //终点ID

//所有路径,不区分开始和结束节点的前后顺序

var allPaths = [[185,184],[186,185],[187,186],[188,187],[189,187],[191,189]];

var result = [];

var tree_num = 1;

var over_num = 0;

/*

pos => 起点坐标id

target => 终点坐标id

key=> 返回的字符串,保存上一层递归完成的路径节点

len => 节点的id差(本例中没用到)

pos0=> 原始起点,防止走回头路

*/

function tree(pos, target, key, len, pos0)

{

var _index = 0;

var others = [];

var tmp = '';

for(x in allPaths)

{

// one point is pos

if (allPaths[x] [0] == pos || allPaths[x] [1] == pos)

{

var other = allPaths[x] [0] == pos ? allPaths[x] [1] : allPaths[x] [0];

if ( (pos > target && (other >= pos || other >= pos0 ) ) || (pos < target && (other <= pos || other <= pos0 ) ) ) continue;

others.push(other);

if (_index > 0)

tree_num ++;

_index ++;

}

}

for(y in others)

{

other = others[y] ;

len += other - pos;

// other one is end?

if (other == target)

{

result.push(key+target+",|"+len);

over_num ++;

continue;

}

// else if (other > endId) continue ?

tree(other, target, key+other+",", len, pos0);

}

// all tree over ?

if (tree_num == over_num)

{

// console.log(result);

}

}

function get_short_path(a,b){

tree(a,b,"",0, a);

var ret = result;

result = [];

var min = 100;

var min_path_str = '';

//求出最短的路径

for (x in ret)

{

var path_arr_str = ret[x].split('|')[0];

var path_arr = path_arr_str.split(",");

var rank = path_arr.length;

if (rank < min)

{

min = rank;

min_path_str = path_arr_str;

}

}

return min_path_str.slice(0,-1).split(",");

}

// tree(begId, "", 0);

var search_arr = [[185,188],[191,184]];

for ( var x in search_arr)

{

var ret = get_short_path(search_arr[x][0], search_arr[x][1]);

console.log(ret);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值