三维点云创建Octrees

## 标题三维点云创建Octrees
1、Octrees的定义
八叉树(Octree)是一种树数据结构,每个内部结点(internal node)有八个子节点(children node)(一变八);在这里插入图片描述
图左:递归切分一个立方体为多个小立方体;
图右:对英的八叉树表示
2、Octrees的计算原理
(1)设定最大递归深度
(2)找出场景的最大尺寸,并以尺寸建立第一个立方体
(3)依序将点放入到没有子节点的立方体
(4)若没有到达最大递归深度,就继续细分八等份,再将该被分立方体所装的点全部分给八个子立方体
(5)如果发现子立方体所分配到的点的个数不为零并且和其父立方体所含点个数相同,则该子立方体不用继续细分
(6)重复(3)达到最大递归深度
3、Octree的存储结构

//定义八叉树节点类    
template<class T>
struct OctreeNode
{
	//节点(每个小立方体)存储的数据,数据类型是否应该是vector<T>
	//此处先写下自己的疑问
	T data;    
	//节点坐标,即六面体个顶点的坐标
	T xmin, xmax;     
	T ymin, ymax;
	T zmin, zmax;
	//该节点的八个子结点(八个立方体)    
	OctreeNode <T>*top_left_front, *top_left_back; 
	OctreeNode <T>*top_right_front, *top_right_back;
	OctreeNode <T>*bottom_left_front, *bottom_left_back;
	OctreeNode <T>*bottom_right_front, *bottom_right_back;
	//节点类
	OctreeNode     
	(   T nodeValue = T(),
		T xminValue = T(), T xmaxValue = T(),
		T yminValue = T(), T ymaxValue = T(),
		T zminValue = T(), T zmaxValue = T(),
		OctreeNode<T>*top_left_front_Node        = NULL,
		OctreeNode<T>*top_left_back_Node         = NULL,
		OctreeNode<T>*top_right_front_Node       = NULL,
		OctreeNode<T>*top_right_back_Node        = NULL,
		OctreeNode<T>*bottom_left_front_Node     = NULL,
		OctreeNode<T>*bottom_left_back_Node      = NULL,
		OctreeNode<T>*bottom_right_front_Node    = NULL,
		OctreeNode<T>*bottom_right_back_Node     = NULL )
		:data(nodeValue),
		xmin(xminValue), xmax(xmaxValue),
		ymin(yminValue), ymax(ymaxValue),
		zmin(zminValue), zmax(zmaxValue),
		top_left_front(top_left_front_Node),
		top_left_back(top_left_back_Node),
		top_right_front(top_right_front_Node),
		top_right_back(top_right_back_Node),
		bottom_left_front(bottom_left_front_Node),
		bottom_left_back(bottom_left_back_Node),
		bottom_right_front(bottom_right_front_Node),
		bottom_right_back(bottom_right_back_Node) {}
};

4、Octrees的细分规则

5、Octrees如何停止细分
(1)如果该节点此时所含的点的数量少于我们之前定义的每个立方体中最多点的个数时,则可以停止细分当前立方体(立方体中最多点的个数是预先设定阈值,其含义是指:点的个数大于该设定阈值后则对该立方体继续细分,小于于该设定阈值则停止对该立方体继续细分);
假设设定阈值为Ph=100(立方体包含最大点的数量),我们在细分该立方体时则需要判断其中所含点的数量是多少(设为Pn),然后和设定阈值相比较大小:
a. 如果Pn<=Ph,则停止对此时的立方体(结点)继续细分,并将这些所含点云存储到该立方体(结点)中;
b. 如果Pn>Ph,则对此时的立方体(结点)继续细分
(2)另一个方法是在停止细分时,看该立方体(结点)细分的数目是否已经超过了细分的标准。例如,我们可以先建立细分的标准为10,如果细分的数量大于这个标准,我们将停止并指定这些在立方体中的点云到该立方体(结点)中。当我们说“大于这个标准”就意味着细分的数量有11个。
(该标准可以理解为八叉树的最大递归深度)
(3)最后的方法是看立方体(结点)总数是否超过结点变量定义时的值。例如,我们设置结点变量的值为500。每次,我们建立一个结点,相应的立方体(结点)数量就增加1个。然后在我们每次建立另一个结点时,检测一下我们当前的结点数是否超过结点变量。如果结点数为501,我们将不会细分这个结点,但是指定立方体的当前所含点云赋给该立方体。

6、参考
《Introduction to Octrees》
https://www.gamedev.net/articles/programming/general-and-gameplay-programming/introduction-to-octrees-r3529
《Quadtrees and Octrees》
https://www.i-programmer.info/programming/theory/1679-quadtrees-and-octrees.html?start=1
《Octrees》-wikipedia
https://en.wikipedia.org/wiki/Octree#References

7、未完待续…

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值