首页 > 编程知识 正文

常规四叉树,qtreewidget虚线

时间:2023-05-04 03:04:13 阅读:168312 作者:1724

这是在单元中可视化的四叉树

与普通四叉树的区别:

一般的四叉树在插入时节点满时进行分割,将当前节点的数据移动到子节点,因此只有叶中有数据,会产生内存的浪费,在数据量大的情况下查询深度会变大。

更新位置时直接删除并重新插入,频繁删除并制作是不合理的。

增强的四叉树:基于深度直接生成满节点的四叉树。 每个节点都有一个对应的矩形树,插入数据时,它会找到可以存储该数据的最小节点。 也就是说,TreeRect包着DataRect。 如果无法存储,请将其放在根节点上。 还有可能无法将数据与节点的treeerect一起存储的DataRect。

更新位置时,首先要检查包含数据的树的TreeRect是否仍然可以包含DataRect

1 .如果可以包含=”递归地尝试将数据移动到当前树的子节点(也就是说,找到最包含此数据的树)

2 .如果不能包装=()尝试将数据递归传输到当前树的父节点(即,找到将此数据包装到根节点的最小树)。如果根节点不能包装,则将数据传输到根节点

改善后的优点:

1 .插入:只有在插入新数据时才正式插入。 更新数据时,请仅更新数据所在的节点,而不要频繁创建删除

2 .冲突检测:在分层检测中,如果要检测物体a与哪个物体发生了冲突,改良版的流程会从根节点(root )开始询问,在a和root发生冲突的情况下,将root中的datas添加到可能发生冲突的集合中进行列表,子节点进行列表

效果如下图所示

红框是检测出的物体碰撞了哪个树,检测碰撞时只将物体和碰撞树的数据追加到检测集合中,

如图所示,如果检测到的物体a所在的树是层级4,则检测到的集合中只包括与每个层级用红色表示的区域对应的树的数据、与自身所在层级(用蓝色表示的区域对应的树的数据、其子节点的数据)

以下是几种极端情况下碰撞检测的数据显示。

1 .如果物体a位于根节点的中心(任何子节点都不能包含a,根可以包含a ) )。

效果如下:

蓝色区域是与a所在树对应的视图,a碰撞的区域是

第0层(根表示的区域,即整个蓝色) ) ) ) )。

1楼(蓝色区域被分割成四部分的区域,边缘覆盖着蓝色,中间是红色) )。

这样,得到数据a与哪个树发生了冲突,将冲突的树的数据追加到有冲突可能性的集合中进行检测,从而大幅提高效率

2 .物体a位于最小节点时

您可以看到,与数据a对应的树视图为蓝色,碰撞树的视图边框变为红色。

所有第0层,第1层右上第2层中心附近的象限,第3层中心附近的象限第4层中心附近的象限。 每层树的视图边界如下图所示

此时检测到可碰撞物体的颜色是绿色,

将右上作为第一象限(Q1 ),左上作为第二象限) Q2 )左下作为第三象限) Q3 )右下作为第四象限) Q4 )

让我们来分析一下为什么检测到这几个有可能发生冲突

! [ ] [ 3359 img-blog.csdn img.cn/20210207024842401.png? x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text _ a hr0 CHM6ly9ibg9nlmnzzg4u bmv0L3 fxxx

中央的蓝色小点是中心点

1号点:因为跨越了一楼的Q2和Q3象限,所以只能放在0楼。 和2号点一样

3号要点:跨越一楼的Q3和Q4象限,同上

4号点:一楼的Q1象限可以容纳它,但由于跨越了二楼的Q1和Q2象限,只能放在一楼的Q1

第五点:一楼的Q1象限可以容纳它,但由于跨越了二楼的Q1和Q4象限,只能放在一楼的Q1上

6号点:因为跨越了一楼的Q1和Q4象限,所以只能安排在0楼

7号点:与5号点相同,只是跨越2楼的Q3和Q4象限

8号要点:跨越第三层Q3和Q4象限,只能放在第二层

9日:第四次包裹,放在四楼

因为:

由于物体a与0层碰撞,所以将0层数据1、2、3、6添加到有碰撞可能性的集合中

物体a与一楼的Q1象限碰撞,所以将数据4、5、7添加到可碰撞的集合中

物体a与2楼的Q3象限冲突,所以追加8号点

因为物体a和自己所在的树发生了碰撞,所以追加9号积分

3。 物体a将要从根节点出来时

原理是一样的

4 .当物体a从根节点出来时

虽然属于根节点,但没有与根节点的碰撞,所以全部不变色,没有可能碰撞的物体

5 .以下是一些一般情况

优化效果截图:

场景内的物体数为500*500个,共计25万个查询冲突0.5ms-1ms左右

四叉树不需要查询16ms左右

最后附上一般四叉树查询的情况。

可以看出,在有2500多个物体的时候,查询速度下降到了2-3ms

改善版查询的效果和次数:

下载链接: https://download.csdn.net/download/QQ _ 39908137/15114913

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。