`
美丽的小岛
  • 浏览: 308290 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

八叉树及K-D树的应用和实现

 
阅读更多

1. 八叉树、k-d树的原理

2. 八叉树、k-d树的应用、优缺点

3. 八叉树、k-d树的实现

 

八叉树和k-d树都经常用来处理三维空间数据,k-d树的使用范围更宽泛些,适用于k维空间的数据,在Sift算法中,k-d树被用于在k维的空间内搜索邻近特征点。

 

1. 八叉树、k-d树的原理

wiki或百科上面都有详细的介绍。

http://en.wikipedia.org/wiki/K-d_tree

http://en.wikipedia.org/wiki/Octree

 

八叉树,一个立方体等分为八份,并可以持续的细分下去,虽然每个节点都能分出八个叉,但形象,且等分空间,简单容易理解。我曾经应用八叉树来离散化一个三角片表示的曲面,离散曲面。



 

 

单看下面的k-d树的图示,就让人眼晕了,虽然k-d树只有两个叉。眼晕的主要原因就是空间不等分。所以,只要理解k-d树划分空间的依据,剩下的细节都与八叉树类似了。其实k-d树叶可以有均分的模式,只要让划分依据变为node的中心点就行了,只不过这样做k-d的效率就不高了。

从下图看,其k-d每个节点划分的依据是 挑选一个维度,在这个维度上 找到 本节点内所有点的中值点,然后,进行划分。

k-d树的其他划分依据: 

取本节点内所有点的重心。

均分法。

使用这些方法时,要注意建树时的终止条件,避免陷入无限的循环(或递归)中。



 

 

(src: http://homes.ieu.edu.tr/hakcan/projects/kdtree/kdTree.html)

 

2. 八叉树、k-d树的应用、优缺点

八叉树一般都用于三维空间,若二维空间,可以用四叉树,原理是一模一样的。八叉树,常用于离散化空间,数据划分存储,数据查找等。

k-d树虽然是二叉树,却适用于k维的空间,而且在k邻域查找时,比较有优势。k-d也长用于数据划分存储,邻域查找等。

二者特性的比较:

八叉树算法的算法实现简单,但大数据量点云数据下,其使用比较困难的是最小粒度(叶节点)的确定,粒度较大时,有的节点数据量可能仍比较大,后续查询效率仍比较低,反之,粒度较小,八叉树的深度增加,需要的内存空间也比较大(每个非叶子节点需要八个指针),效率也降低。而等分的划分依据,使得在数据重心有偏斜的情况下,受划分深度限制,其效率不是太高。

k-d在邻域查找上比较有优势,但在大数据量的情况下,若划分粒度较小时,建树的开销也较大,但比八叉树灵活些。在小数据量的情况下,其搜索效率比较高,但在数据量增大的情况下,其效率会有一定的下降,一般是线性上升的规律。

也有将八叉树和k-d树结合起来的应用,应用八叉树进行大粒度的划分和查找,而后使用k-d树进行细分,效率会有一定的提升,但其搜索效率变化也与数据量的变化有一个线性关系。

 

3. 八叉树、k-d树的实现

采用递归的方式,代码比较简单,逻辑明了,前提是对递归不要太陌生。

网上有很多Octree的实现和库。如

http://www.flipcode.com/archives/Octree_Implementation.shtml

http://code.google.com/p/efficient-sparse-voxel-octrees/

http://akbar.marlboro.edu/~mahoney/support/alg/alg/node41.html

http://nomis80.org/code/octree.html

opencv中的也有octree的实现

 

Octree建树的逻辑:

自定义哪些数据类型? 

tree类型,node类型;

每个节点应该包含哪些数据? 

8个子节点指针,本节点的中心(划分与搜索的依据)和半径,点的个数,和子节点保存数据的容器

常用的手法是非叶子节点的点的个数为0,容器内无数据

如何划分数据?如何建立索引?

每个节点都会保存自己的中心坐标和半径,子节点保存数据,非子节点一般不保存数据,有了中心半径和本节点内的数据,就能划分建树,或者搜索

 

BuildTree(数据集, 数据个数, 中心,半径,当前深度)         // 递归建树函数

确定递归停止条件和动作,count < num_threshold 或 递归深度达到最大 时,为子节点

并保存子节点数据和个数

若无中心和半径,计算数据集的最小包围盒半径和中心

依据中心和半径,将数据划分为八份,计算八个子节点的中心和半径

进行新的八次递归建树 child[i]->BuildTree(新的数据集,新的数据个数,新的中心、半径,深度+1).

删除临时数据容器,释放内存

 

Search(point)

确定递归停止条件:子节点的个数为小于阈值,或递归深度达到最大

搜遍本节点内的数据,查找给定的点,若找到,返回true,找不到,返回false

取本节点的中心和半径,计算出应该在下一层那个子节点进行搜索,如k

子节点递归搜索,child[k]->search(point);

 

K-D树的逻辑:

自定义数据类型?

tree: 提供建树和搜索的接口

node节点,node节点里包含中心,半径,划分的维度,两个子节点指针,数据容器(子节点专用)

如何划分数据?

每个node计算数据的包围盒,每个维度的宽度,最大宽度的维度用于划分,计算中心(重心法,或排序中值法),然后子节点继续划分

 

Build()

确定递归停止条件,本节点数据点数小于阈值,或达到最大深度,为子节点,保存数据。

由本节点的数据,计算包围盒,每个维度的宽度,最大宽度的维度用于划分计算中心(重心法,或排序中值法),然后划分数据

子节点由划分的数据继续下一步的划分建树child[i]->build()

 

最邻近点搜索,递归法:

find_closest_point(point)

确认本节点是子节点,停止递归,计算本节点内最邻近的点,及距离d。

若非子节点:

计算点到分割面的距离spd, 为正数,child[0]->find_closest_point(point),在子节点0中继续搜索。

若计算出的最近点距离d 大于 分割面距离 spd,则仍需要在节点1中继续搜索最邻近点。

若距离分割面是非正数,在子节点1中搜索。

若计算出的最近点距离d 大于 分割面距离 spd,则仍需要在节点0中继续搜索最邻近点。

  • 大小: 23.4 KB
  • 大小: 4.4 KB
  • 大小: 10.4 KB
分享到:
评论

相关推荐

    柱形八叉树模型的运算规则及应用

    ### 柱形八叉树模型的运算规则及应用 #### 一、八叉树模型概述 八叉树模型作为一种重要的非线性数据结构,在计算机科学领域占据着举足轻重的地位。它不仅在工程应用中有着广泛的应用场景,还在计算机图形学、...

    点云数据在深度学习中表示方法的研究.pdf

    点云数据是指利用三维扫描设备采集得到的一组离散点...通过八叉树和K-D树的有效结合,不仅实现了点云数据的高效组织,而且确保了三维模型细节特征的完整表达,为深度学习模型在处理点云数据时的输入提供了新的可能性。

    Java实现排序的12种方式(3).zip_java排序(3)_八叉树

    在IT领域,排序是计算机科学中的基础操作,特别是在...在学习和实践中,了解这些排序算法的原理和实现细节,有助于提升编程能力,解决实际问题。此外,理解每种算法的时间复杂度和空间复杂度也是优化代码性能的关键。

    室内移动机器人RGB-D+SLAM算法研究1

    此外,还构建了实验室场景的八叉树地图,展示了算法在实际环境中的应用能力。 【关键词】:SLAM,RGB-D,ORB特征,位姿图优化,八叉树地图,EPNP算法 综上所述,该硕士学位论文深入研究了室内移动机器人RGB-D SLAM...

    Computational Geometry in C - J o'orourk.pdf

    5. 空间分割方法:用于管理大规模几何数据,比如四叉树、八叉树、k-d树等数据结构,能够有效地组织空间信息并快速查询。 6. 几何算法优化:包括时间复杂度和空间复杂度的优化,确保在处理复杂几何问题时算法的效率...

    kdtree-master.zip_kdtree_zip

    因此,有时会采用其他变种,如球树(ball tree)、Octree(八叉树)等。此外,kd树在机器学习、计算机图形学、地理信息系统等领域广泛应用,比如支持向量机(SVM)的核函数计算、3D图形渲染中的碰撞检测、推荐系统中...

    游戏中碰撞检测最详细

    1. 碰撞检测基础:涵盖了空间分割技术、边界体积层次结构、四叉树、八叉树和k-d树等,这些是实时碰撞检测中常用的数据结构。 2. 几何形状处理:详细解释了点、线、多边形、球体、凸包、包围盒、多面体等基本几何体...

    HPC中加速特征检索的空间索引研究_Exploring Spatial Indexing for Accelerated Fea

    常见的空间索引结构包括k-d树(k-dimensional tree)、R树和八叉树(octree)。这些数据结构都是为了优化几何范围搜索,即查找在特定空间区域内的所有数据点。 论文首先对20个开源的C和C++库进行了综合分析,这些库...

    Real-Time Collision Detection PDF 英文 文字版

    5. **空间划分技术**:为了提高性能,通常需要使用空间划分技术,如四叉树、八叉树、二叉空间分割树(BSP树)或K-D树等,来优化物体间可能的碰撞对检测。 6. **连续碰撞检测**:为了避免快速移动对象的碰撞检测失败...

    计算几何:方法与应用Computational Geometry: Methods and Applications

    这类问题常使用数据结构如k-d树、R树、八叉树等空间索引方法来提高搜索效率。搜索问题在数据库、GIS、以及图形渲染中都有广泛应用。 最后,相交问题(Intersection Problems)关注的是线段、多边形或其他几何体之间...

    Real-Time Collision Detection

    - **八叉树**:三维空间中的分层空间划分方法,每个父节点最多有八个子节点。 - **K-D树**:一种基于空间分割的树形数据结构,通过递归地将空间沿着坐标轴切分成多个矩形区域。 - **哈希网格**:使用哈希表存储网格...

    PCL_Test.rar

    3. **Octree**:八叉树(Octree)是三维空间中的另一种数据结构,它将空间分割成多个子立方体,每个子立方体可以进一步分为8个更小的子立方体,以此类推。在PCL中,Octree用于存储和处理点云数据,尤其适用于内存...

    计算机图形学课件.ppt

    - **八叉树法(Octree)**:将空间划分为八个子区域,递归地进行细分。 - **BSP树法(Binary Space-partitioning tree)**:通过一系列超平面将空间分割为两个部分。 - **K-D树法(K-dimensional tree)**:通过一...

    算法文档无代码计算几何学算法文档无代码计算几何学

    如空间划分结构(k-d树、八叉树、R树等)能够有效地管理空间数据,并优化查询效率。空间划分结构通过递归地将空间划分为子区域,以满足特定的数据管理需求。 ### 应用实例 - **计算机图形学**:通过计算几何学确定...

    5029计算机图形学A卷.pdf

    接下来的判断题涉及了Bezier曲线的性质、光照模型的对比、Phong算法的计算复杂度、透视投影的概念、八叉树的数据结构效率、B样条曲线的共线情况、参数连续和几何连续的关系、轴测投影的类型、NURBS曲线的优势以及光...

    计算机图形学基础:第五讲 光线跟踪加速 (Ray Tracing Acceleration)

    3. **四叉树/八叉树 (Quadtree/Octree)**:空间分割的数据结构,每个节点都有四个或八个子节点,用于将三维空间细分成更小的部分,加速光线与物体的匹配。 4. **空间二分树 (K-d tree/BSP tree)**:类似于二叉树的...

    cub3d

    常见的有顶点数组、索引缓冲区、 octrees(八叉树)或kd-trees(k-d树)用于空间划分,以及图形渲染队列等。这些数据结构有助于优化内存使用和提高渲染性能。 3. 算法:在3D渲染中,算法起着关键作用。比如,Z-...

Global site tag (gtag.js) - Google Analytics