使用VTK检查一个点是否在内部并成为对象

时间:2018-10-08 09:43:02

标签: c++ qt vtk

我正在追踪this example,以检查给定点是否在对象内。 以下代码是使用多维数据集的示例的摘要。

mystring

在自定义的polyData对象中检查点时,该函数未返回我期望的结果:

vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New();
cubeSource->Update();
vtkPolyData* cube = cubeSource->GetOutput();

vtkSmartPointer<vtkSelectEnclosedPoints> selectEnclosedPoints = vtkSmartPointer<vtkSelectEnclosedPoints>::New();
double test[3] = {0.0, 0.0, 0.0};

vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
points->InsertNextPoint(test);
vtkSmartPointer<vtkPolyData> pointsPolydata = vtkSmartPointer<vtkPolyData>::New();
pointsPolydata->SetPoints(points);

selectEnclosedPoints->SetInputData(pointsPolydata);
selectEnclosedPoints->SetSurfaceData(cube);
selectEnclosedPoints->Update();

std::cout << "Point: " << selectEnclosedPoints->IsInside(0) << std::endl;

我的猜测是,多维数据集结构还具有 selectEnclosedPoints-> IsInside 函数使用的其他类型的信息,但我看不到它缺少什么。

1 个答案:

答案 0 :(得分:1)

vtkSelectEnclosedPoints是检查点是否在对象内部的正确方法。但是,the algorithm需要一个由3d范围的像元组成的(理想闭合)表面。您的多数据对象由顶点(它们是0D范围的单元格)组成。差异在此SO answer中进行了解释。

使用以下伪代码(在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 example collection(“单元”一节)。如果您使用点云,则首先需要计算凸包或在点周围定义一个曲面。以See here为例。

希望这会有所帮助!


更新:添加了示例如何使用vtkDelaunay3D提取凸包的示例。请确保还阅读文档中的说明。如果这些点未形成规则的模式,则Delaunay三角剖分的计算趋于更稳定。

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()