C++ 使用VTK检查点是否在内部和对象

C++ 使用VTK检查点是否在内部和对象,c++,qt,vtk,C++,Qt,Vtk,为了检查一个给定的点是否在一个物体内部,我正在跟随。 下面的代码是使用多维数据集的示例的摘要 vtkSmartPointer<vtkCubeSource> cubeSource = vtkSmartPointer<vtkCubeSource>::New(); cubeSource->Update(); vtkPolyData* cube = cubeSource->GetOutput(); vtkSmartPointer<vtkSelectEnclos

为了检查一个给定的点是否在一个物体内部,我正在跟随。 下面的代码是使用多维数据集的示例的摘要

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;
vtkSmartPointer cubeSource=vtkSmartPointer::New();
立方体资源->更新();
vtkPolyData*cube=cubeSource->GetOutput();
vtkSmartPointer selectEnclosedPoints=vtkSmartPointer::New();
双重测试[3]={0.0,0.0,0.0};
vtkSmartPointer points=vtkSmartPointer::New();
点->插入下一点(测试);
vtkSmartPointer pointsPolydata=vtkSmartPointer::New();
点POLYDATA->设定点(点);
选择封闭点->设置输入数据(pointsPolydata);
选择封闭点->设置曲面数据(立方体);
选择封闭点->更新();
std::cout设定点(点SVTK);
polyData->SetVerts(vertsVTK);
point_poly->GetPointData()->AddArray(标签);
point_poly->GetPointData()->AddArray(大小);
vtkSmartPointer selectEnclosedPoints=vtkSmartPointer::New();
双重测试[3]={1,1,0};
vtkSmartPointer points=vtkSmartPointer::New();
点->插入下一点(测试);
vtkSmartPointer pointsPolydata=vtkSmartPointer::New();
点POLYDATA->设定点(点);
选择封闭点->设置输入数据(pointsPolydata);
选择封闭点->设置曲面数据(polyData);
选择封闭点->更新();

std::cout
vtkSelectEnclosedPoints
是检查点是否位于对象内部的正确方法。但是,需要由具有3D范围的单元组成的(理想闭合)曲面。polydata对象由顶点(即具有0D范围的单元)组成。这一差异在本文中得到了解释

通过以下伪代码(在python中),我演示了如何构造可与
vtkSelectEnclosedPoints
一起使用的polydata对象:

# 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()
有关如何创建多边形数据对象的更多示例,请参见(单元)部分。在使用点云的情况下,首先需要计算凸包或围绕点定义曲面。举个例子

希望这有帮助


更新:添加了如何使用提取凸包的示例。请务必阅读文档中的注释。如果点没有形成规则图案,则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()

由于我的polydata中没有关于单元的信息,我将尝试用这些点构造一个多边形,然后检查该点是否在内部,类似这样的内容:如果只有点,则需要指定“内部”的含义。我建议计算点周围的凸包,你试过了吗?我添加了一个示例的链接。我按照您的建议进行了操作,但函数“isInside”无法找到对象内部的点。我坚信这是由于缺乏关于细胞的信息造成的。没错,我所指的例子中可能缺少一件事。需要应用after
vtkDelaunay3D
来提取曲面。此外,如果结果不符合预期,您可能必须使用
vtkDelaunay3D
SetOffset()
选项。添加了一些说明如何提取凸包的代码(这至少对我有效)
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()