Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在八叉树中合并叶子_C++_Algorithm_Tree_Computational Geometry_Quadtree - Fatal编程技术网

C++ 在八叉树中合并叶子

C++ 在八叉树中合并叶子,c++,algorithm,tree,computational-geometry,quadtree,C++,Algorithm,Tree,Computational Geometry,Quadtree,我有一个非常大的点云(>100000点),我想在其中检测平面排列。我决定使用八叉树将点分解成非常小的平面簇,然后合并相邻的共面簇。我已经编写了C++中的代码,将点云快速分割成小平面簇,但是如何有效地合并它们是回避我……/P> 我的Octree实现使用了指针结构:有OctreeNodes和数组OctreeNode*children[8]包含指向其子节点的指针,或者如果是叶节点,则包含所有NULL指针 我的第一个想法是,在每个八叉树节点对象中,保留一个指向平面对象的指针。第一次分割点后,八叉树中的每

我有一个非常大的点云(>100000点),我想在其中检测平面排列。我决定使用八叉树将点分解成非常小的平面簇,然后合并相邻的共面簇。我已经编写了C++中的代码,将点云快速分割成小平面簇,但是如何有效地合并它们是回避我……/P> 我的
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 );