PCL学习笔记(七)-- 八叉树OcTree

一、八叉树简介

  1)简述八叉树

  描述三维空间的八叉树和描述二维空间的四叉树有相似之处,二维空间中的正方形可以被分为四个相同新装的正方形,而三维空间中的正方体可以被分为八个形状大小相同的正方体。因此,八叉树可以看成是四叉树方法在三维空间内的推广,也可以认为是三维体素阵列表示形体方法的一种改进。使用八叉树可以快速进行三维目标的集合运算,如交、并、补、差等,亦可以快速进行最近邻点或区域的搜索,缺点是八叉树需要消耗一定的存储空间。

  2)八叉树的逻辑结构:

  假设需要表示的形体V可以放在一个充分大的立方体C中,形体V在C中的八叉树递归如下:

  八叉树的根节点就是立方体C本身,而八叉树的每一个子节点都对应着C的一个子立方体。如果形体V的大小完全等于立方体C,那么形体V的八叉树就只有树根。

  如果形体V不等于立方体C,则将C等分为8个子立方体,每个子立方体都对应着八叉树中的一个子节点,只要某个子立方体不是完全空白,或者完全被形体V所占据,这个子立方体就要被八等分,同样这样生成的子立方体也就对应了新的子节点。

  递归判断会一直进行下去,直到节点所对应的立方体完全空白,或是完全被形体V所占据,又或是其大小已经是预先定义的体素大小,并且其与形体V相交的部分存在一定的舍入,使得体素认为这个节点所对应的立方体是空白的,或是被形体V完全占据的。

  3)八叉树的数据结构

  八叉树所生成的节点可以分为以下三类:

  灰色节点:它对应的立方体部分被目标占据(非叶节点)

  白色节点:它对应的立方体没有被目标占据(叶节点)

  黑色节点:它对应的立方体完全被目标占据(叶节点)

  对于非叶节点,数据结构以八元数法进行区分,将其分解为更小的子区块,每个区块有节点容量,当节点达到最大容量时,节点停止分裂。

  4)八叉树的存储结构

  八叉树有三种不同的存储结构,分别是规则方式、线性方式以及一对八式,相应的八叉树也分别被称为规则八叉树、线性八叉树以及一对八式八叉树。

  (1)规则八叉树:

  规则八叉树的存储结构用一个有九个字段的记录来表示树中的每个节点。其中一个字段来描述该节点的特性(根据八叉树的数据结构,只需要描述它是灰白黑三类节点中的哪一类就行),其余的八个字段分别用来存放指向其他八个子节点的指针。由于需要使用大量指针,所以规则八叉树在存储空间的使用率上很不理想。

  (2)线性八叉树:

  线性八叉树注重考虑如何提高空间利用率。用某一预先确定的次序遍历八叉树(例如以深度第一的方式),将八叉树转换为一个线性表,表的每个元素与一个节点相对应。对于节点的描述可以相对丰富一点,一如可以用适当的方式来说明他是否是叶节点,如果不是叶节点的话,还可用其八个子节点值的平均值作为非叶节点的值。这样,可以再内存中以紧凑的方式来表示线性表,可以不用指针或者仅用一个指针即可。

  线性八叉树节省了存储空间,对某些运算也较为方便,但丧失了一定的灵活性。

  (3)一对八式八叉树:

  一个非叶节点有八个子节点,将他们分别标记为0~7。吐过一个记录与一个节点相对应,那么在这个记录中描述的就是这个节点的八个子节点的特性值。而指针给出的则是该八个子节点所对应记录的存放处,而且还隐含假定了这些子节点记录存放的次序。也就是说,即使某个记录是不必要的(例如该节点已是叶节点),那么相应的存储位置也必须空置出来,以保证不会错误存取到其他同辈节点的记录,当然这样做会有一定的浪费。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值