0

各面が頂点の座標で記述されているメッシュ ファイルをインポートしています。ほとんどの頂点はポイント間で共有されます。thresholdしたがって、既にクラウドに追加されているポイントよりも近いポイントを削除したいと考えています。つまり、最近接ポイントの検索とポイントの挿入を同時に効率的に実行する必要があります。

vtkPointLocator私はすでに静的クラウドに使用したものを使用しようとしています。しかし、それがどのように段階的に使用されることになっているのか途方に暮れています。ドキュメントは非常に簡潔で、例 (例: this one ) はこのシナリオをカバーしていません。この投稿は多少役に立ちましたが、まだ有効な解決策がありません - セグメンテーション違反InsertNextPoint(以下のケース)、無限再帰(の代わりCheateChildNodeに使用する場合)、または VTK エラー ( のように、ゼロ点がある場合) が発生します。 .vtkIncrementalOctreePointLocatorvtkPointLocatorno 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ソースを読むと、ポイントセットが変更された場合、ルックアップごとにインクリメンタル クラスでさえ呼び出しているように見えますが、これにはコストがかかる可能性があります。したがって、挿入/検索を組み合わせたより良いクラスの提案もいただければ幸いです。

4

1 に答える 1

1

問題を正しく理解している場合は、vtkCleanPolyDataを PointMergingOn と特定の許容範囲で確認することをお勧めします。

于 2013-03-06T08:54:49.680 に答える