Удаление точек из облака, находящихся ближе порогового расстояния

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

Я пытаюсь использовать vtkPointLocator, который я уже использовал для статического облака; но я в недоумении, как его можно использовать постепенно. документация довольно кратка, и примеры (например, этот) не распространяется на этот сценарий. Этот пост был несколько полезен, но у меня до сих пор нет рабочего решения - я получаю 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 при каждом поиске, если набор точек был изменен, что может быть дорого. Поэтому предложение по лучшему классу для комбинированной вставки/поиска также будет оценено.


person eudoxos    schedule 02.03.2013    source источник


Ответы (1)


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

person shash    schedule 06.03.2013
comment
Будет ли это правильно переназначать топологию? т.е. если грань определяется вершинами (3,4,5) и 5 ​​объединяется с 2, станет ли она (3,4,2)? - person eudoxos; 13.03.2013
comment
Да. Это то, что он должен делать. - person shash; 20.03.2013