关于二叉树、四叉树和八叉树

关于二叉树、四叉树和八叉树

树(tree)是一种常用的数据结构。它是由一个或多个节点组成的有限集T,它有一个特定节点,成为根节点。其余节点分为m(m大于等于0)个互不相交的有限集T0,T1,...,Tm-1,其中每个集合又是一棵树,称T0~Tm-1为根节点的子树。树结构的类型有二叉树(Binary Space Partitioning Trees)、四叉树、八叉树(octree)、十六叉树等。为了适应各种应用问题的需要,多种不同的存储结构也相应地建立起来。

二叉树是一种表示最简单、运算最简便的树形结构。简称BSP树,即为二叉树空间细分。BSP树通过一细分平面将一空间细分为两个区域。树的叶节点表示空间体元,分枝节点表示细分空间的分割平面。对于虚拟场景的实时绘制而言,BSP树的最大优点是可以构造较好的均衡树,尤其是当场景中对象不均衡分布时,从而减少树的深度。这样实时渲染时,可以快速遍历整个场景,加速场景绘制。然而,对于场景中的动态对象渲染需要花费昂贵的树结构更新代价,每一次动态对象渲染时将其加入到静态树结构中绘制,然后重新移去动态对象。

四叉树作为数据处理表达技术的一个方法已经有很多年了,特别是地形渲染引擎都能利用他很有效的作为剔出机制,四叉树被描述通过对应每个父节点传递四个子节点,在一个地形渲染上下文里,根节点将会表达为这个围绕地形的正方形区域集,自节点表示为“左上”,“右上”,“左下”和“右下”象限,这些象限由根节点组成并且每一个都是由四个字节点递归的定义.

八叉树结构(图4-39)就是将空间区域不断地分解为八个同样大小的子区域(即将一个六面的立方体再分解为八个相同大小的小立方体),分解的次数越多,子区域就越小,一直到同—区域的属性单一为止。

按从下而上合并的方式来说,就是将研究区空间先按—定的分辨率将三维空间划分为三维栅格网,然后按规定的顺序每次比较3个相邻的栅格单元,如果其属性值相同则合并,否则就记盘。依次递归运算,直到每个子区域均为单值为止。八叉树主要用来解决GIS中的三维问题。 

八叉树可分为常规八叉树和线性八叉树。常规八叉树的结点要记录十个位,即八个指向子结点的指针,—个指向父结点的指针和一个属性值(或标识号)。而线性八叉树则只需要记录叶结点的地址码和属性值。它有两个优点:一、节省存储空间;二、线性八叉树可直接寻址,通过其坐标值则能计算出任何输入结点的定位码(称编码),而不必实际建立八叉树,并且定位码本身就是坐标的另—种形式,不必有意去存储坐标值;三、在操作方面,所产生的定位码容易存储和执行,容易实现象集合、相加等组合操作。

 八叉树采用类似于二维的四叉树结构对场景进行空间细分,整个三维空间被细分成小的立方体。这些立方体通过采用递归表的方式组织成层次结构,以便对每个区域所包含的对象进行细分直到满足所需的分辨率为止。场景的八叉树层次结构在预处理阶段生成,实时绘制时依据视点变化对树结构进行自适应的修改。树结构也可用于对场景进行视域体裁减计算和其它可见性计算以及虚拟场景的碰撞检测等。对场景进行八叉树体细分能很好的支持建筑场景空间几何剖分。图表示使用八叉树细分地形模型,其中黄色线条表示空间划分,绿色代表地形模型。如图(a)所示,以地形模型中相隔最远的两顶点之间距离作为外包立方体的边长,使用一次剖分时,将立方体平均分成上下、前后、左右共8快,使用二次剖分时,对包含有地形模型的每一小块接着分割,将产生细分方格,依此类推,使用三次剖分时,会将整个空间分隔成更加细致的方格,如图(b)所示。
  

其实,八叉树是四叉树在高度空间的一种扩展,它们之间有很多的相似点。四叉树是以一种“空间曲面”的形式来描述3D地形,而八叉树是以一种“空间立方体”的形式来描述3D地形。从地形外貌的复杂度来说,八叉树更胜一筹,但代价却是效率的降低。从某种程度来说,八叉树可以完全实现室内和室外两种地形,并且可以将二者融合起来,对于这一点,国外的研究者已经实现了。但因为着眼于效率的考虑,还是觉得应该根据游戏场景的不同类型而选择各自不同的管理方式并连接起来。

 总的来说,二叉树大概是上世纪80年代出现的,当时由于还没有出现支持“Z_buffer”的硬件,为了避免重绘,人们用二叉树来实现室内场景各种多边形的深度顺序排列上,以实现“从后往前绘制”的作用。这些年,由于支持“Z_buffer”的硬件的出现,二叉树的这一作用逐渐降低;现在,它的主要用途是用于“可见性判断”及“碰撞检测”上,而对于室内场景的管理上,它只是非常适合“静态室内场景”的渲染管理上,对于动态的场景,它还是有很多缺陷的,因为每当动态地在室内场景添加或删除一个多边形的时候,二叉树就要重新构造一次,这在效率上是很大的降低。为什么要重新构造一次呢?我想可能是因为二叉树的分割面是以多边形为基准的缘故吧,从这一点上说,八叉树是个不错的选择,因为八叉树的分割面并不以多边形为基准面。

你可能感兴趣的:(算法与数据结构)