vtkSelectEnclosedPoints
- это правильный способ проверить, находится ли точка внутри объекта.Однако алгоритм требует (идеально замкнутой) поверхности, состоящей из ячеек с трехмерным экстентом .Ваш объект полиданных состоит из вершин (которые являются ячейками с 0D-экстентом).Разница объясняется в этом SO ответе .
С помощью следующего фиктивного кода (на python) я демонстрирую, как можно создать объект полиданных, который можно использовать с vtkSelectEnclosedPoints
:
# Create poly data object
surfacePoly = vtk.vtkPolyData()
surfacePoly.SetPoints(points)
surfacePoly.SetPolys(cells) # 2D cells, not verts!
# ...
# Use surfacePoly as input
selectEnclosed = vtk.vtkSelectEnclosedPoints()
selectEnclosed.SetInputData(pointsPoly)
selectEnclosed.SetSurfaceData(surfacePoly)
selectEnclosed.Update()
См. Пример vtkколлекция (раздел «Ячейки»), где приведены дополнительные примеры создания объектов данных poly.Если вы работаете с облаком точек, вам сначала нужно вычислить выпуклую оболочку или определить поверхность вокруг ваших точек. См. Здесь для примера.
Надеюсь, это поможет!
Обновление: Добавлен пример извлечения выпуклой оболочки с помощью vtkDelaunay3D
.Обязательно прочтите также примечания в документации.Вычисление триангуляции Делоне имеет тенденцию быть более устойчивым, если точки не образуют регулярные структуры.
polyPoints = vtk.vtkPolyData()
polyPoints.SetPoints(points)
triangulation = vtk.vtkDelaunay3D()
triangulation.SetInputData(polyPoints)
# Tuning parameter.
# triangulation.SetOffset(100.0)
triangulation.Update()
# Extract the surface
convexHull = vtk.vtkDataSetSurfaceFilter()
convexHull.SetInputConnection(triangulation.GetOutputPort())
convexHull.Update()
# And retrieve the corresponding polydata object.
surfacePoly = convexHull.GetOutput()