从云中移除比阈值距离更近的点

时间:2013-03-02 10:17:07

标签: vtk point-clouds

我正在导入网格文件,其中每个面都由其顶点的坐标描述。大多数顶点在点之间共享。因此,我想消除比threshold更接近已经添加到云中的点的点。这意味着我需要同时有效地执行最近点查找和点插入。

我尝试使用已经用于静态云的vtkPointLocator;但我很遗憾应该如何逐步使用它。 documentation非常简洁,示例(例​​如this one)不包含此方案。 This post有点帮助,但我仍然没有一个有效的解决方案 - 我在InsertNextPoint(下面的情况)中获得了段错误,CheateChildNode中的无限递归(使用{{1}时) },而不是vtkIncrementalOctreePointLocator),或者一些VTK错误(如vtkPointLocator,当零点时)。

这与我的工作大致相同:

no points to subdivide

如果错误的组织方式存在明显错误,我会很乐意提出任何建议。如果没有,我会尝试制作MWE。

从阅读源代码看,即使增量类在每次查找时都调用// read from input file std::vector<Vector3d> vertices; // bounds of the data are known double bounds[6]={/*...*/}; const double threshold=1e-5; auto locator=vtkSmartPointer<vtkIncrementalOctreePointLocator>::New(); auto polydata=vtkSmartPointer<vtkPolyData>::New(); auto points=vtkSmartPointer<vtkPoint>::New(); polydata->SetPoints(points); locator->SetDataSet(polydata); locator->InitPointInsertion(points,bounds); for(size_t i=0; i< i<vertices.size(); i++){ double* vertex=vertices[i].data(); // pointer to data double dist; // unused vtkIdType id; // don't search if there are no points yet // FindClosestPointWithinRadius calls BuildLocator internally, // which needs some points to be present already if(points->GetNumberOfPoints()>0) id=locator->FindClosestPointWithinRadius(threshold,vertex,dist); else id=-1; if(id<0){ // point not found, insert it into the locator locator->InsertNextPoint(vertex); } } ,如果修改了点集,这可能很昂贵。因此,对于组合插入/查找的更好类别的建议也将受到赞赏。

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,您可能需要使用PointMergingOn和给定的容差来查看vtkCleanPolyData