快速、模板化、C++ 八叉树实现

Posted

技术标签:

【中文标题】快速、模板化、C++ 八叉树实现【英文标题】:Fast, templated, C++ Octree implementation 【发布时间】:2011-05-11 12:08:51 【问题描述】:

我一直在寻找快速、高效、模板化(即具有类似 STL 的属性)八叉树实现的高低(主要在谷歌上),但没有成功。我想在 3D 场景图的上下文中使用它。

这样的事情是否存在,或者人们通常会自己滚动?我希望我在 *** 的朋友知道在哪里可以找到。

【问题讨论】:

一般我觉得,如果你想要最快的解决方案,你必须自己动手,因为用例千差万别,从八叉树存储点,八叉树存储具有大小的元素,松散八叉树更有效地存储具有大小的元素,体素数据的 SVO,使用 SPFP 的八叉树,使用 DPFP 的八叉树,使用整数来利用更多按位运算的八叉树,等等等等。这个列表还在继续,如果你找到一个通用的八叉树非常有效地满足所有可能的标准,使用它可能会很可怕......就像一个策略类模板...... ... 有 16 种不同的策略可以指定为模板参数,例如,此时仅使用这样一个笨重的东西可能比自己动手或找到一个简单但有效的例子需要更多的时间狭隘适用,更接近您的需求并根据需要进行调整。通用数据结构往往适用于更简单的事情,例如 std::vector 抽象出可变大小动态数组的概念,几乎没有/没有性能损失(唯一的原因是我能想到任何人想要其他东西 [...] [...] 是如果他们想要不同的重新分配/保留策略,例如能够控制向量在满时重新分配多少内存,或者使用小于 64 位的整数来存储大小和容量) - 非常挑剔的东西。但是,当您使用更复杂的结构(例如空间索引)时,尤其是数据结构,这些数据结构往往会根据其使用的领域而具有各种形状和大小,因此尝试搜索一般的数据结构变得非常笨拙-完美的目的的东西,因为在这一点上“通用”和“为我的目的而制造”是不兼容的。 【参考方案1】:

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

这是我的最爱。它是 GPL 并且有它自己的主页,所以它的目的是供其他人使用。它有 Doxygen 文档,作者正在回答问题。

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

这个不是模板化的。它的代码中的 cmets 比我见过的所有其他代码都多,因此如果您想了解八叉树的工作原理,这可能会更有用。

【讨论】:

GPL 代码并不是真的要被其他人使用。至少在现实世界中不是。 ;)【参考方案2】:

最近也发布了:http://www.openvdb.org/

梦工厂的卷层次格式。

【讨论】:

哇!非常感谢您的提示。【参考方案3】:

看看这个:http://svn.pointclouds.org/pcl/trunk/octree/

更新链接:https://github.com/PointCloudLibrary/pcl/tree/master/octree

【讨论】:

谢谢。有趣,但似乎没有记录。 我的错误。找到文档:docs.pointclouds.org/group__octree.html. 另外,还有一个 test/test_octree.cpp 可以查看使用情况。 关于如何在不包含和编译整个点云库的情况下使用它的一些想法?

以上是关于快速、模板化、C++ 八叉树实现的主要内容,如果未能解决你的问题,请参考以下文章

在八叉树中合并叶子

PCL——八叉树Octree

如何对 sparxe 体素八叉树 (SVO) 进行三角测量

Mark四叉树与八叉树

PCL:八叉树Octree实现点云K近邻搜索

PCL:八叉树(Octree)实现点云半径内近邻搜索