三维点云处理第二章(3)---Octree

八叉树是专门为三维设计的,它本身就是一个个正方体。在最临近搜索里面最大的好处就是可以提前结束搜索。

如何构建一个八叉树?一个八叉树里面最基础的元素叫做octant,也就是立方体。第一步构建一个最大的正方体或正方形(以二维来讲解就是正方形),此处由d、g、f三个元素确定·。要怎么切取决于leaf_size(也可以是最小边长,边长足够小,就不需要切割了,比如多个点叠在一起),如果leaf_size为1,也就是最后叶节点内数据仅有一个,我们有必要切割到立方体内仅有一个元素。s1被切为4块,有一块没有元素,不管,再切割s2四块,仅有两个有元素,进步切割s5,同理s3,s4仅有一个元素,无需继续切割。如图。

 代码上,一个最基本的元素如何表达?子节点有八个,立方体中心点,extent为半个边长,即中心点到边长,立方体里有的点,是不是叶节点。构建八叉树的代码。db所有点,根据这些点构八叉树,进来后根节点不存在,就建一个,把这些点都放进去。放进去根据leaf_size决定要不要继续分割八叉树。第一个绿框用于计算每一个子节点里面都有些什么样的数据点。第二框计算每一个数据点在哪,中心点为多少,把属于这个子节点的数据点放进去,再调用这个递归函数建下一层的octant。

 如何做KNN查找?首先还没有找到根节点,所以最坏距离为无穷大,先找自己所在的区域,可能性更大,然后找S8(自己就在s8),s8仅有一个点,自到了自己跟e的距离,找到了一个比较小的合理的最坏距离,画一个圆,回到s2,进s5,进一步查找下一些层,s10\s11\12都搜索,找到s12时最坏距离变小了,s2都搜索完了,此时不需要找s3,s4。因为我的圆,最近的点都被s2包围了,其它都跟我没有关系,于是提前结束搜索。

 代码:如果根节点为空,啥都不用做了。如果这是一个末端节点(叶节点),那就直接把这个末端节点里面的所有点拿过来对比一下,放到KNNReaultSet(那个容器)里面。如果不是一个末端节点,那就去最有可能的找。

 一个圆是否被正方体完全包围。向量 = 起点-终点

 一个球跟一个正方体是否有交集。

 

 

 

 

 一个球是否完全包围了一个正方体

 RadiusNN查找就只需要将resultse替换一下就可以,如果半径包含了一个正方体,那最近邻居就只要查找这个正方体内所有点就可以了。

复杂度

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值