C++ 在八叉树中合并叶子
我有一个非常大的点云(>100000点),我想在其中检测平面排列。我决定使用八叉树将点分解成非常小的平面簇,然后合并相邻的共面簇。我已经编写了C++中的代码,将点云快速分割成小平面簇,但是如何有效地合并它们是回避我……/P> 我的C++ 在八叉树中合并叶子,c++,algorithm,tree,computational-geometry,quadtree,C++,Algorithm,Tree,Computational Geometry,Quadtree,我有一个非常大的点云(>100000点),我想在其中检测平面排列。我决定使用八叉树将点分解成非常小的平面簇,然后合并相邻的共面簇。我已经编写了C++中的代码,将点云快速分割成小平面簇,但是如何有效地合并它们是回避我……/P> 我的Octree实现使用了指针结构:有OctreeNodes和数组OctreeNode*children[8]包含指向其子节点的指针,或者如果是叶节点,则包含所有NULL指针 我的第一个想法是,在每个八叉树节点对象中,保留一个指向平面对象的指针。第一次分割点后,八叉树中的每
Octree
实现使用了指针结构:有OctreeNode
s和数组OctreeNode*children[8]
包含指向其子节点的指针,或者如果是叶节点,则包含所有NULL
指针
我的第一个想法是,在每个八叉树节点
对象中,保留一个指向平面
对象的指针。第一次分割点后,八叉树中的每个叶将获得一个表示叶中包含的所有点的最小二乘拟合的平面。然后我迭代树中的每个叶节点。对于每个叶节点,我检查它的每个相邻叶节点:如果邻居的平面应该与当前叶的平面合并,我调用plane*newPlane=plane::mergePlanes(this->plane,neighbor->plane)
创建表示两个节点中的点的新平面
这就是我遇到麻烦的地方。。。我首先认为我可以简单地用新平面替换两个平面,即plane=newPlane;邻居->平面=新平面代码>并完成(内存泄漏放在一边;我用真正的代码处理它们)。不幸的是,这在实践中不起作用。合并多个平面后,可能会有多个不同的八叉树节点
指向单个平面
,只需替换此->平面
和相邻->平面
中的指针,并不会替换指向其旧平面的所有指针
即使在我第一次提出这个解决方案的时候,它看起来也很粗糙,现在它的缺陷更加明显了。有谁能想出一个方法来修复我提出的合并方法,或者想出一个更好的方法
谢谢VTK有一个类似的点句柄类。我认为合并插入点的理想点
例如:
因此,我的观点是:如果类太大,则更容易重建它。标准修复方法是延迟修复节点。有一个访问方法,可以查看您所指向的平面,然后查看它是否已指向其他位置。如果有,递归搜索直到找到它所在的位置,并将所有对象修复回当前对象,然后返回正确的平面
这比跟随指针要昂贵得多,但实际上这并不像你想象的那样昂贵,因为大多数时候最终对象都在你看的第一或第二个位置
double xyz[3]; // location
id_type point_id; // we get back the point id
// bool InsertUniquePoint( double xyz[3], id_type &point_id );
// return value is true, if new point inserted
bool value = inserter->InsertUniquePoint( xyz, point_id );