四叉树QTree增强版

这是在unity里可视化的四叉树在这里插入图片描述
跟普通的四叉树有何区别:
普通四叉树是 当插入的时候 如果节点满了 则去分割,然后把当前的节点的数据转移到子节点去,这样就造成了 只有叶子上才有数据,造成了内存浪费,且当数据量大的时候 查询深度大。
当更新位置的时候是 直接删除再重新插入,频繁删除创建,不合理。
增强版四叉树:直接根据深度生成满节点的四叉树,每个节点有个自己所对应的矩形TreeRect,当有数据插入的时候,找到最小能容纳此数据的节点(即TreeRect包裹住DataRect),如果都不能容纳就放到根节点上(可能跟节点的TreeRect都包裹不住此数据的DataRect)。
当更新位置的时候,先去查看 数据所在的树(CurrentTree)的TreeRect是否仍然能包裹住DataRect
1.如果能包裹住那么 =》递归尝试把数据转移到CurrentTree的子节点里去(即找到最小包裹此数据的树)
2.如果不能包裹住=》递归尝试转移数据到CurrentTree的父节点去(即找到最小包裹此数据的树),直到根节点(如果根节点都包裹不住,就把数据转移到根节点)

改进后的优势:
1.插入:只有在有新的数据插入的时候才去真正的插入,当数据更新的时候,只是更新数据所在的节点,避免频繁创建删除
2.检测碰撞:是分层检测,假设物体A要去检测和哪些物体发生了碰撞, 改进版的流程是 从根节点(root)开始查询,如果A与root发生了碰撞 则把root里的datas添加进可能发生碰撞的集合里List, 然后再子节点递归调用碰撞检测
效果如下图
在这里插入图片描述
红框为 检测的物体 与哪些树发生了碰撞,检测碰撞时 只把与物体发生碰撞的树里的数据添加到检测集合里,
在这里插入图片描述
如图所示,检测的物体A 所在的树为第4层, 那么检测的集合里只会包含每层 标红区域所对应树的数据,也包括自身所在的层(标蓝色的区域 所对应树的数据,和它的子节点的数据)

下面演示几种 极端情况下的碰撞检测的数据显示情况:
1.当物体A 在root(根节点)的中心(那么任何的子节点都不能包裹住A,root可以包裹住A)
效果如下:
在这里插入图片描述
蓝色区域为 A所在树所对应的视图,A发生碰撞的区域为
第0层(root所代表的的区域 即蓝色整个)
第1层(蓝色区域 四分后的 区域,边缘被蓝色覆盖,但中间是红色的)

在这里插入图片描述
这样就得到数据A 与哪些树发生碰撞,把发生碰撞的树里的数据添加到可能发生碰撞的集合里,再去检测,大大提高效率
2.当物体A 在最小节点时
在这里插入图片描述
可以看到数据A 所对应的Tree的视图为 蓝色,它发生碰撞的树的视图边框已经变为红色了,
第0层全部 ,第1层的右上角 第二层的 靠中心的那一个象限,第三层 靠中心的那个象限 第四层 靠中心的那个象限,每一层树的视图 边界如下图所示

在这里插入图片描述

此时检测 到可能碰撞的物体的颜色为绿色,
假设右上为 第一象限(Q1),左上为 第二象限(Q2) 左下为第三象限 (Q3) 右下为第四象限(Q4)

分析一下 为什么会检测出这几个是可能碰撞的

![](https://img-blog.csdnimg.cn/20210207024842401.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5OTA4MTM3,size_16,color_FFFFFF,t_70在这里插入图片描述
中间的青色小圆点为 中心点
1号点 :因为 它横跨 第一层的Q2和Q3象限,所以 它只能放在第0层, 2号点一样
3号点 :因为它横跨 第一层的 Q3和Q4象限 所以同上

4号点 :第一层的 Q1象限是可以容纳它的, 但是 它横跨 第二层的 Q1和Q2象限,所以只能放在第一层的Q1上
5号点 :第一层的 Q1象限是可以容纳它的, 但是 它横跨 第二层的 Q1和Q4象限,所以只能放在第一层的Q1上
6号点: 它横跨第一层的 Q1和Q4象限,所以只能放在第0层
7号点:同5号点, 但它是横跨 第二层的Q3和Q4象限
8号点: 它横跨第三层的Q3和Q4象限,只能放在第二层
9号点:它被第四次包裹,它放在第四层

因为:
物体A 与 第0层碰撞,所以把第0层的数据 1、2、3、6 加入可能碰撞的集合里

物体A与第1层的Q1象限碰撞 所以把 数据4、5、7加入可能碰撞的集合里

物体A与 第二层的Q3象限碰撞 所以把8号点 加入
物体A与自身所在的树发生碰撞 所以加入9号点

3。当物体A快要出根节点时
可以看到 物体A所在的节点为根节点(蓝框显示)
原理同上
4.当物体A出了根节点

它扔属于根节点,但是它不与根节点的发生碰撞 所以全部都没变色,没有可能发生碰撞的物体

5.下面是几个一般情况
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

优化后的效果截图:
在这里插入图片描述
场景里物体数为500*500个 共计25万个 查询碰撞0.5ms-1ms左右
在这里插入图片描述
不用四叉树 查询 16ms左右

最后附上 一般性的四叉树 查询情况:
在这里插入图片描述
可以看到 在物体2500多个的时候 查询速度就降到了2-3ms了

改进版 查询效果和次数:
在这里插入图片描述
下载链接:https://download.csdn.net/download/qq_39908137/15114913

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值