js实现四叉树算法huansky

最近在看canvas动画方面教程,里面提到了采用四叉树检测碰撞。之前也看到过四叉树这个名词,但是一直不是很懂。于是就又找了一些四叉树方面的资料看了看,做个笔记,就算日后忘了,也可以回来看看。

QuadTree四叉树顾名思义就是树状的数据结构,其每个节点有四个孩子节点,可将二维平面递归分割子区域。QuadTree常用于空间数据库索引,3D的椎体可见区域裁剪,甚至图片分析处理,我们今天介绍的是QuadTree最常被游戏领域使用到的碰撞检测。采用QuadTree算法将大大减少需要测试碰撞的次数,从而提高游戏刷新性能,

四叉树很简单,就是把一块2d的区域,等分成4份,如下图:我们把4块区域从右上象限开始编号,逆时针。

四叉树起始于单节点。对象会被添加到四叉树的单节点上。

当更多的对象被添加到四叉树里时,它们最终会被分为四个子节点。(我是这么理解的:下面的图片不是分为四个区域吗,每个区域就是一个孩子或子节点)然后每个物体根据他在2D空间的位置而被放入这些子节点中的一个里。任何不能正好在一个节点区域内的物体会被放在父节点。(这点我不是很理解,就这幅图来说,那根节点的子节点岂不是有五个节点了。)

如果有更多的对象被添加进来,那么每个子节点要继续划分(成四个节点)。

正如你看到的,每个节点仅包括几个物体。这样我们就可以明白前面所说的规则,例如,左上角节点里的物体是不可能和右下角节点里的物体碰撞的。所以我们也就没必要运行消耗很多资源的碰撞检测算法来检验他们之间是否会发生碰撞。

下面我们对四叉树进行实现:主要代码:(代码是从整个四叉树类里面拷贝出来的,所以带有this,大家不要无视就好,末尾附有完整的代码)

functionQuadTree(boundBox,lvl){varmaxObjects=10;this.bounds=boundBox||{x:0,y:0,width:0,height:0};varobjects=[];this.nodes=[];varlevel=lvl||0;varmaxLevels=5;}maxObjects是每个节点能容纳的最多对象超过则分割4个节点,我们并不是事先就分好格子,而是在插入对象的时候才进行划分。

maxLevels是四叉树的最大层数超过则不再划分从根节点开始最多6层。

level:当前层数

objects:当前节点内的待检测的对象。

bounds:当前节点所表示的2d区域的范围

nodes:4个子节点队列。

四叉树每个节点的面积可以为任意形状。然后,我们会使用五个四叉树里会用到的方法,分别为:clear,split,getIndex,insert和retrieve。

functionclear(){objects=[];for(vari=0;i

functionsplit(){//Bitwiseor[html5rocks]varsubWidth=(this.bounds.width/2)|0;varsubHeight=(this.bounds.height/2)|0;this.nodes[0]=newQuadTree({x:this.bounds.x+subWidth,y:this.bounds.y,width:subWidth,height:subHeight},level+1);this.nodes[1]=newQuadTree({x:this.bounds.x,y:this.bounds.y,width:subWidth,height:subHeight},level+1);this.nodes[2]=newQuadTree({x:this.bounds.x,y:this.bounds.y+subHeight,width:subWidth,height:subHeight},level+1);this.nodes[3]=newQuadTree({x:this.bounds.x+subWidth,y:this.bounds.y+subHeight,width:subWidth,height:subHeight},level+1);}Split方法,就是用来将节点分成相等的四份面积,并用新的边界来初始化四个新的子节点。

functiongetIndex(obj){varindex=-1;varverticalMidpoint=this.bounds.x+this.bounds.width/2;varhorizontalMidpoint=this.bounds.y+this.bounds.height/2;//ObjectcanfitcompletelywithinthetopquadrantvartopQuadrant=(obj.yhorizontalMidpoint);//Objectcanfitcompletelywithintheleftquadrantsif(obj.xverticalMidpoint){if(topQuadrant){index=0;}elseif(bottomQuadrant){index=3;}}returnindex;};getIndex方法是个四叉树的辅助方法,在四叉树里,他决定了一个节点的归属,通过检查节点属于哪个象限。(最上面第一幅图不是逆时针在一个面积里划分了四块面积,上面标示了他们的序号,这个方法就是算在一个父节点里他的子节点的序号)

比如当前区域是Rectange(0,0,600,600)待检测矩形是Rectangel(0,0,30,30)那么他就在左上象限index=1如果是Rectange(400,400,30,30)那么他就在右下象限index=3

functioninsert(obj){if(typeofobj==="undefined"){return;}if(objinstanceofArray){for(vari=0,len=obj.length;imaxObjects&&level10个并且当前节点的层数

一旦对象添加上后,要看看这个节点会不会分裂,可以通过检查对象被加入节点后有没有超过一个节点最大容纳对象的数量。分裂起源于节点可以插入任何对象,这个对象只要符合子节点都可以被加入。否则就加入到父节点。

functionretrieve(returnedObjects,obj){if(typeofobj==="undefined"){console.log("UNDEFINEDOBJECT");return;}varindex=this.getIndex(obj);if(index!=-1&&this.nodes.length){this.nodes[index].findObjects(returnedObjects,obj);}for(vari=0,len=objects.length;i

THE END
1.C++AVL树的讲解和编写首先,我们要明白,上图中结构在插入前是一颗AVL树,插入后要想满足左单选的条件,上面插入前的原图中数据为30结点的平衡因子必须为1,插入后变为2,即c树中插入结点后高度必加1且插入后数据为60结点的高度满足平衡条件,因为我们在往上排查中发现的是最近一个结点的平衡失调,而原图中30所对应的结点是parent结点。至于https://open.alipay.com/portal/forum/post/161301037
2.四叉树算法的英文四叉树算法翻译四叉树算法英语怎么说海词词典,最权威的学习词典,专业出版四叉树算法的英文,四叉树算法翻译,四叉树算法英语怎么说等详细讲解。海词词典:学习变容易,记忆很深刻。http://dict.cn/%E5%9B%9B%E5%8F%89%E6%A0%91%E7%AE%97%E6%B3%95
3.四叉树算法(KrigingCal)开发实例源码下载四叉树算法(KrigingCal) C#语言基础 下载此实例 开发语言:C# 实例大小:0.08M 下载次数:11 浏览次数:289 发布时间:2021-01-18 实例类别:C#语言基础 发布人:y2534836761 文件格式:.zip 所需积分:2 相关标签:拓扑空间查询 网友评论举报投诉收藏该页 同类人气实例https://www.haolizi.net/example/view_159378.html
4.哪位能讲讲四叉树算法以及其实现原理四叉树算法在实际应用中非常广泛,比如用于游戏中的路径规划、图像处理中的快速搜索算法等。同时,由于其复杂度较高,因此在使用时需要权衡效率和准确性之间的关系。 有用(0) 回复 举报 相关问题 家电 1.3万 浏览 1044 回答 手机性能天梯榜讨论 4389 浏览 615 回答 显卡 2.1万 浏览 614 回答 硬盘 1.5万 https://wap.zol.com.cn/ask/details_25095091_530842_3.html
5.基于小波树和四叉树的图像分形编码算法研究AET对高分辨率子带,将水平、垂直和对角3个方向的小波子带结合起来考虑,形成小波树结构,设定一个阈值,小波树所有系数小于等于阈值则直接置零;大于阈值的小波树采用四叉树算法进行分形编码,如果误差小于等于阈值,则记录分形编码参数,否则进行四叉树分裂。对算法进行了Matlab仿真,结果表明,在保证一定解码图像质量的情况下,http://www.chinaaet.com/article/213726
6.C#四叉树算法源码及Demo示例解析资源摘要信息: "四叉树 C# 源码" 知识点: 1. 四叉树概念: 四叉树是一种树形数据结构,通常用于管理二维空间数据。它可以将二维空间划分为四个象限(或称为“象限”),每个象限又可以继续划分为更小的四个象限,这样递归地划分可以有效地管理和索引空间数据。四叉树在计算机图形学、游戏开发、地理信息系统(GIS)以https://wenku.csdn.net/doc/578exm6884
7.一种基于四叉树的改进的ORB特征提取算法首先,将图片构造成图像金字塔来解决尺度不变性问题;然后,在每一层金字塔图像上检测角点来提取特征点;接着,引入四叉树算法来均匀化分布特征点并计算特征点的方向和描述子;最后,以华硕深度摄像头(Xtion PRO)为实验工具,在室内环境下提取周边特征点,并将提取效果与其他方法进行对比,实验证明了所提算法在图像特征均匀化https://mall.cnki.net/magazine/Article/JSJA2018S2044.htm
8.数据结构与算法四叉树(javascript实现)罗松与拇指(这部分就直接抄了,见参考)四叉树(Q-Tree)是一种树形数据结构。四叉树的定义是:它的每个节点下至多可以有四个子节点,通常把一部分二维空间细分为四个象限或区域并把该区域里的相关信息存入到四叉树节点中。这个区域可以是正方形、矩形或是任意形状。以下为四叉树的二维空间结构(左)和存储结构(右)示意图(注https://segmentfault.com/a/1190000000495387
9.算法&数据结构——四叉树优雅的实现一颗四叉树 具备功能 创建树 插入节点 删除节点 遍历节点 类的定义 template<class Value>class Tree4{public:// 在范围内, 创建一颗指定层次的四叉树Tree4(constMATH Rect&,size_t);// 判断某一区域是否包含在四叉树内template<class Range>Tree4*Contain(constRange&);// 根据给定区域, 插入一https://www.jianshu.com/p/8463a567a9b3
10.一种基于四叉树划分的改进ORB算法摘要: 原ORB (oriented FAST and rotated BRIEF)算法提取的图像特征点经常出现“扎堆重叠”现象,其分布较为密集且缺乏尺度不变性,因而容易造成图像特征点误匹配的问题。为了解决该问题,提出了一种基于四叉树划分的图像特征点提取算法。首先对图像建立尺度金字塔,然后使用四叉树划分图像并限制划分深度。用加速分段测试的https://www.amm.shu.edu.cn/CN/abstract/abstract18860.shtml
11.干货想学习优化算法,不知从何学起?Greedy Randomized Adaptive Search 算法超详细解析,附代码实现TSP问题求解 群体仿生类 基于MPI的并行遗传算法 应用篇 主要介绍应用前面所学的框架,来求解各类问题,包括如何设计算子,如何创新算法框架等等。 干货| 十分钟掌握禁忌搜索算法求解带时间窗的车辆路径问题(附C++代码和详细代码注释) 论文拾萃 | 基于树表示法的https://zhuanlan.zhihu.com/p/556105438
12.四叉树LOD,quad四叉树LOD例句>> 2) Quadtrees 四叉树 1. Preprocessing LOD algorithm for large scale terrain based on restricted quadtrees; 基于限制性四叉树LOD大规模地形预处理算法 2. Autonomou System Environment Modeling Based on Quadtrees; 用四叉树算法建立自主系统环境模型 3. A Fractal Image Compression http://www.dictall.com/indu58/34/58343674864.htm
13.基于Unity的数字化车间改进资源动态调度算法摘要:针对基于Unity引擎的车间仿真系统加载过程中内存占用大, 导致系统在运行时存在卡顿、不流畅的现象, 从模型资源加载角度设计一种资源动态调度算法. 首先通过四叉树算法将场景递归的分割成多个叶子节点进行存储, 然后结合资源动态调度算法以摄像机位置为中心对周边节点的资源进行预设实例化和预设销毁完成内存的管理. 最https://c-s-a.org.cn/html/2018/10/6567.html
14.四叉树开源地理空间基金会中文分会开放地理空间实验室摘要: 四叉树(quad-tree)是一种数据结构,是一种每个节点最多有四个子树的数据结构。 四叉树可以用来在数据库中放置和定位文件(称作记录或键)。这一算法通过不停的把要查找的记录分成4部分来进行匹配查找直到仅剩下一条记录为止。 在树中,记录被存储在叶子的位置上。这 https://www.osgeo.cn/wiki/%E5%9B%9B%E5%8F%89%E6%A0%91
15.四叉树数据结构的编码方法Read.PPT四叉树数据结构的编码方法-Read.PPT 51页内容提供方:jinchenl 大小:1.75 MB 字数:约4.15千字 发布时间:2019-03-25发布于天津 浏览人气:2126 下载次数:仅上传者可见 收藏次数:1 需要金币:*** 金币 (10金币=人民币1元)四叉树数据结构的编码方法-Read.PPT 关闭预览 想预览更多内容,点击免费在线https://max.book118.com/html/2019/0323/8076004007002014.shtm
16.八叉树索引(精选七篇)Beckmmann等[6]在R树的基础上提出了R*树, 相比于R树, R*树的优越性体现在查找方式和节点操作的多样性, 并且它同时支持点和空间数据的索引, 但是R*树的索引构建时间比R树略高。支晓栋等[7]提出的一种改进四叉树算法可以快速完成索引树的构建, 但是该算法构建的索引树的树高减小, 降低了数据的查询速度。https://www.360wenmi.com/f/cnkey1wp269n.html