描述:
四叉树和八叉树就是2D和3D的“二分法”,搜索过程与二叉树搜索也类似,二叉树中是将数组sort后存入二叉树中,从而在查找中实现时间复杂度为log2N;四叉树/八叉树是按平面/空间范围划分有序node,将所有points(坐标已知,但是每个点的point在vector中的index可以认为是随机的,没有规律的,所以不能直接根据index取出point(x,y))放入所属node中,实现所有points的sort,进而在搜索时,实现时间复杂度为log4N/log8N ----WellP.C
特别注意:树中任一节点的子节点恰好只会有八个,或零个,也就是子节点不会有0与8以外的数目。
八叉树可以用来碰撞检测、邻域检索、空间变化检测、压缩等功能。
优点,使用八叉树可以快速进行三维目标的集合运算,如交、并、补、差等,亦可快速进行最邻近区域或点的搜索。
缺点,存储空间消耗。
松散八叉树
松散八叉树的基本思想和普通八叉树一样,但是每个长方体的大小选中比较宽松。而如果一个普通长方体的边长为l,那么可以用kl来代替,其中k>1,如下图所示。
图11 一个普通八叉树和松散八叉树的比较。图中黑色的原点表示长方形的中心点(第一次细分)。在左图中,星形物体刺穿了一个普通八叉树的一个分割平面。,这样,一种选择就是将这个星型物体放在最大的长方形中(根节点的长方体)。而右图所示为一个k=1.5的松散八叉树,也就是将长方体放大了50%,如果将这些长方体稍微移动,就可以保证区分出它们。这样,这个星型多边形就完全位于左上角的长方形之中。
代码参考
https://github.com/Nition/UnityOctree
分为2种
1.按照包围盒, 有松散比例的BoundsTree
2.按照点的
支持动态添加和删除,有三维DeBug的显示, 碰撞检测.
四叉树是八叉树的二维情况.
将几何体保存在树结构中的一个好处是, 只要该树的某个节点不可见时, 其子节点也同样不可见.
参考: