threejs 组成的3d管道,寻最短路径问题
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);
}
threejs 组成的3d管道,寻最短路径问题的更多相关文章
- Threejs 使用的3D格式
3D格式你可以通过任意软件导出(.3ds,dae等),但是threejs 无法使用, 1,http://www.blender.org/ 下载这款开源的3d软件 2,https://github.co ...
- 在threejs中对3D物体旋转的思考
今天在写threejs时,突然想到一个问题:一个3D物体需要旋转时,一般情况下简单的旋转我都是使用欧拉角,稍微复杂一些的情况我会把欧拉角转换成四元数进行旋转(欧拉角复杂旋转可能会产生的死锁问题),但是 ...
- ThreeJS的特效合成器和后期处理通道
最近要写个 web 交互式发光可交互的框架.没查到啥好资料,自己一个人摸索了很久,有些失望,可是毕竟是探索过的东西,所以做个记录,怀念我过去好多天掉的青丝(捂脸).我在前面那篇博客里面已经介绍了如何让 ...
- 基于 HTML5 Canvas 的 3D 渲染引擎构建生产管控系统
前言 大家好,老郑我又回来了.这一期为大家带来一个非常好玩的 demo,我们制作一套自己的 3D 管道控制系统,运用了( http://www.hightopo.com )HT 的 Graph3dVi ...
- 在SAP UI中使用纯JavaScript显示产品主数据的3D模型视图
在Jerry写这篇文章时,通过Google才知道,SAP其实是有自己的3D模型视图显示解决方案的. 故事要从Right Hemisphere说起,这是一家专业的企业级2D/3D模型浏览及转换的软件供应 ...
- reactjs中使用threejs从0到1
搭建本地开发环境 安装nodejs 按照 Create React App 安装指南创建一个新的项目 npx create-react-app react-three-demo 删除掉新项目中 src ...
- Three.js 保存camera(视角)设置到数据库,包括场景的缩放、旋转、移动等
最近在做的项目中遇到需要保存当前的3d管道视角设置的问题,用户希望在对3d场景内的管道进行了缩放.旋转.移动之后可以将场景当前的视角状态保存在数据库中,并在下次加载时读取. 经过不断的尝试和研究,在同 ...
- OpenGL编程逐步深入(九)插值处理
注:文中VS代指顶点着色器,FS代指片段着色器. 准备知识 这个教程和大家展示3d管道中非常重要的部分,即Interpolation(插值).光栅化程序执行的插值变量由VS产生.正如你已经见到过的,为 ...
- CSharpGL(56)[译]Vulkan入门
CSharpGL(56)[译]Vulkan入门 本文是对(http://ogldev.atspace.co.uk/www/tutorial50/tutorial50.html)的翻译,作为学习Vulk ...
随机推荐
- http://codeforces.com/contest/349
A. Cinema Line time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- JavaScript中错误正确处理方式,你用对了吗?
JavaScript的事件驱动范式增添了丰富的语言,也是让使用JavaScript编程变得更加多样化.如果将浏览器设想为JavaScript的事件驱动工具,那么当错误发生时,某个事件就会被抛出.理论上 ...
- Centos7安装Percona5.7
OS: Centos7.0 DB: Percona5.7 1. 通过yum安装 ## 删除之前的mysql数据库, 我用的是centos7.再安装虚拟机的时候,预装了很多软件.所以mysql和mari ...
- 【转】Python实现修改Windows CMD命令行输出颜色(完全解析)
用Python写命令行程序的时候,单一的输出颜色太单调.其实我们可以加些色彩,比如用红色表示警告,绿色表示结果正常等.网上也有几篇类似的帖子,但是没有把问题讲清楚,贴的代码也不是太清晰.这里,对Win ...
- zoj 2022
分析: 组合数学类型的题目. 正常的话可能会去分解1~N数里面有几个5和2,但是这样的复杂度为O(nlogn). 其实有更巧妙的办法,可以把问题分解成子问题. 可以发现N!末尾的0与1~N中有几个5的 ...
- SQL 2008 外网访问说明
1. 安装SQL2008 . 安装SQL2008之前,必须预先安装.NET Framework 3.5,和Windows Installer 4.5 Redistributable. 可能产生错误: ...
- 使用IGP和BGP的配合达到降低路由容量目的的实验与总结
概述 1.先说结论,通过eBGP协议,可以显著降低对非核心路由器的路由容量要求,因为核心路由器的数量明显少于非核心路由器,所以,通过此措施即联通网络,又降低设备要求,非常适宜大型网络. 2.因为网络规 ...
- Java命令模式以及来自lambda的优化
前言 设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...
- 全球多个 TOP 网站藏挖矿代码,5 亿 PC 沦为矿工
据ZDNet报道,现在很多网站都开始在网页脚本中藏匿挖矿代码,在用户访问时偷算力用于挖矿.来自Adguard的报告称也证实,也有5亿台电脑中招. 最新最热的IT技术付费社区 IT帮 itbang.me ...
- DOM2练习
左右互相输入 <!DOCTYPE html><html> <head> <meta charset="UTF-8"&g ...