2013-03-02 3 views
0

Я импортирую файл сетки, где каждая грань описывается координатами ее вершин. Большинство вершин разделяются между точками. Поэтому я хотел бы устранить точки, которые ближе, чем threshold, к точке, которая уже добавлена ​​в облако. Это означает, что мне нужно эффективно выполнять поиск ближайшей точки и точку в то же время.Удаление точки из облака, которые ближе, чем пороговое расстояние

Я пытаюсь использовать vtkPointLocator, который я уже использовал для статического облака; но я нахожусь в убытке, как предполагается, что он будет использоваться постепенно. documentation является довольно кратким, и примеры (например, this one) не охватывают этот сценарий. This post был несколько полезен, но у меня все еще нет рабочего решения - я получаю segfaults в InsertNextPoint (пример ниже), бесконечная рекурсия в CheateChildNode (при использовании vtkIncrementalOctreePointLocator вместо vtkPointLocator) или некоторая ошибка VTK (например, 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 при каждом поиске, если был изменен узел, что может быть дорогостоящим. Поэтому было бы также предложено предложение для лучшего класса для комбинированной вставки/поиска.

ответ

1

Если я правильно понимаю вашу проблему, вы можете посмотреть на vtkCleanPolyData с помощью PointMergingOn и данного допуска.

+0

Будет ли это правильно переназначать топологию? То есть если грань определяется вершинами (3,4,5) и 5 ​​сливается с 2, станет ли она (3,4,2)? – eudoxos

+0

Да. Это то, что он должен делать. – shash

 Смежные вопросы

  • Нет связанных вопросов^_^