各面が頂点の座標で記述されているメッシュ ファイルをインポートしています。ほとんどの頂点はポイント間で共有されます。threshold
したがって、既にクラウドに追加されているポイントよりも近いポイントを削除したいと考えています。つまり、最近接ポイントの検索とポイントの挿入を同時に効率的に実行する必要があります。
vtkPointLocator
私はすでに静的クラウドに使用したものを使用しようとしています。しかし、それがどのように段階的に使用されることになっているのか途方に暮れています。ドキュメントは非常に簡潔で、例 (例: this one ) はこのシナリオをカバーしていません。この投稿は多少役に立ちましたが、まだ有効な解決策がありません - セグメンテーション違反InsertNextPoint
(以下のケース)、無限再帰(の代わりCheateChildNode
に使用する場合)、または VTK エラー ( のように、ゼロ点がある場合) が発生します。 .vtkIncrementalOctreePointLocator
vtkPointLocator
no points to subdivide
これはおおよそ私がしていることです:
// 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);
}
}
エラーの構成方法に明らかなエラーがある場合は、喜んで提案します。そうでない場合は、MWE を作成してみます。
BuildLocator
ソースを読むと、ポイントセットが変更された場合、ルックアップごとにインクリメンタル クラスでさえ呼び出しているように見えますが、これにはコストがかかる可能性があります。したがって、挿入/検索を組み合わせたより良いクラスの提案もいただければ幸いです。