我正在导入网格文件,其中每个面都由其顶点的坐标描述。大多数顶点在点之间共享。因此,我想消除比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);
}
}
,如果修改了点集,这可能很昂贵。因此,对于组合插入/查找的更好类别的建议也将受到赞赏。