удалить отдельные точки из vtkPoints - PullRequest
3 голосов
/ 29 июля 2011

У меня есть вопрос относительно класса VTK, который называется vtkPoints.Класс имеет функциональность для вставки отдельных точек, но не имеет функциональности для удаления отдельных точек.Это неудобно для случая, когда необходимо обновить представление, вызвав vtkPoints :: Modified (), чтобы снова запустить графический конвейер для обновления / повторного рендеринга представления.Очевидный случай повторной инициализации vtkPoints, повторного добавления всех точек и обновления / повторного рендеринга представления слишком медленный и ресурсоемкий.

Есть ли возможное решение этой проблемы?

Спасибо, ловец времени

Ответы [ 4 ]

2 голосов
/ 23 мая 2017

Пример http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/DeletePoint имеет довольно простое решение.Скопируйте точки в другие временные точки vtkPoints, отфильтровав идентифицируемый идентификатор и скопируйте его в исходный:

void ReallyDeletePoint(vtkSmartPointer<vtkPoints> points, vtkIdType id)
{
  vtkSmartPointer<vtkPoints> newPoints = 
    vtkSmartPointer<vtkPoints>::New();

  for(vtkIdType i = 0; i < points->GetNumberOfPoints(); i++)
    {
    if(i != id)
      {
      double p[3];
      points->GetPoint(i,p);
      newPoints->InsertNextPoint(p);
      }
    }

  points->ShallowCopy(newPoints);
}
1 голос
/ 12 октября 2011

Нет способа удалить отдельные точки из vtkPoints.В зависимости от того, в чем заключается ваша проблема, вот несколько возможных решений:

  1. Сохраните все точки в одном экземпляре vtkPoint, перезаписайте точки, от которых вы хотите избавиться, значением, которое нужно заменить.Это было бы полезно, чтобы ограничить максимальный объем памяти, который может использовать облако точек.
  2. Храните все точки в одном экземпляре vtkPoint, перезаписывайте точки, от которых вы хотите избавиться, значением, которое находится далекоиз вашей сцены.
  3. Создайте vtkPoint, vtkCellArray и vtkPolyData для каждой точки, соедините их вместе, используя vtkAppendPolyData.У него есть RemoveInput (vtkPolyData *), поэтому вы можете удалить отдельные точки.
0 голосов
/ 05 августа 2011

Разрешение удаления точки из vtkPoints может привести к повреждению набора данных, использующего эту точку.Вам также придется удалить все ячейки, которые используют эту точку, а также уменьшить массивы данных точек.

Я бы предложил, чтобы у вас был фильтр, который создает vtkPoints для изменения объекта vtkPoints и всего, что зависитоб этом в методе RequestData ().

0 голосов
/ 31 июля 2011

Нет: он имеет те же ограничения на изменяемость, что и массив float []. Единственный способ удалить точку - это скопировать и исключить. Обратите внимание, что вы будете подвергаться тому же штрафу за копирование при выполнении операций Insert (), если вы превысите предварительно выделенное хранилище.

Другие связанные параметры структуры данных включают vtkCollection и vtkPolyData. Кроме того, может быть полезно взглянуть на источник некоторых фильтров клипов PolyData, чтобы получить представление о том, как эти типы операций реализованы внутри - они должны быть такими же быстрыми, как и в пределах ограничений структуры данных. .

...