Я импортирую файл сетки, где каждая грань описывается координатами ее вершин. Большинство вершин разделяются между точками. Поэтому я хотел бы устранить точки, которые ближе, чем 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
при каждом поиске, если был изменен узел, что может быть дорогостоящим. Поэтому было бы также предложено предложение для лучшего класса для комбинированной вставки/поиска.
Будет ли это правильно переназначать топологию? То есть если грань определяется вершинами (3,4,5) и 5 сливается с 2, станет ли она (3,4,2)? – eudoxos
Да. Это то, что он должен делать. – shash