我正在追踪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 函数使用的其他类型的信息,但我看不到它缺少什么。
答案 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()