使用vtk库,将得到的三维点,分别使用script得到三维体,和使用三角化得到三维体,然后再将这两个三维体进行布尔运算得到其交集,最后将交集得到的体显示出来,为什么这段代码并没有显示图像。点集得到的两个体,我有使用两段代码分别测试过,都是可以显示出来,为什么相交的体会显示不出来。
def tu_pict(self):
if hasattr(self, 'df'):
points = self.df[["E", "N", "Z"]].values
print(points)
# 第一段代码:得到三维体
points = points.tolist()
vtk_points = vtk.vtkPoints()
for point in points:
vtk_points.InsertNextPoint(point)
polydata = vtk.vtkPolyData()
polydata.SetPoints(vtk_points)
convex_hull = vtk.vtkConvexHull2D()
convex_hull.SetInputData(polydata)
convex_hull.Update()
convex_mapper = vtk.vtkPolyDataMapper()
convex_mapper.SetInputConnection(convex_hull.GetOutputPort())
convex_actor = vtk.vtkActor()
convex_actor.SetMapper(convex_mapper)
convex_actor.GetProperty().SetColor(0.8, 0.8, 0.8)
# 第二段代码:三角化得到三维体
x = self.df['E'].tolist()
y = self.df['N'].tolist()
z = self.df['Z'].tolist()
points = vtk.vtkPoints()
for i in range(len(x)):
points.InsertNextPoint(x[i], y[i], z[i])
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)
delaunay = vtk.vtkDelaunay3D()
delaunay.SetInputData(polydata)
delaunay.Update()
triangulated_polydata = delaunay.GetOutput()
extract_edges = vtk.vtkExtractEdges()
extract_edges.SetInputData(triangulated_polydata)
extract_edges.Update()
vertex_glyph_filter = vtk.vtkVertexGlyphFilter()
vertex_glyph_filter.SetInputData(polydata)
vertex_glyph_filter.Update()
points_mapper = vtk.vtkPolyDataMapper()
points_mapper.SetInputConnection(vertex_glyph_filter.GetOutputPort())
points_actor = vtk.vtkActor()
points_actor.SetMapper(points_mapper)
points_actor.GetProperty().SetPointSize(3)
points_actor.GetProperty().SetColor(1, 1, 1)
edges_mapper = vtk.vtkDataSetMapper()
edges_mapper.SetInputConnection(extract_edges.GetOutputPort())
edges_actor = vtk.vtkActor()
edges_actor.SetMapper(edges_mapper)
edges_actor.GetProperty().SetColor(1, 0, 0)
# 进行布尔运算,获取交集体
boolean_operation = vtk.vtkBooleanOperationPolyDataFilter()
boolean_operation.SetInputConnection(0, convex_hull.GetOutputPort())
boolean_operation.SetInputConnection(1, triangulated_polydata)
boolean_operation.SetOperationToIntersection()
boolean_operation.Update()
intersection_mapper = vtk.vtkDataSetMapper()
intersection_mapper.SetInputData(boolean_operation.GetOutput())
intersection_actor = vtk.vtkActor()
intersection_actor.SetMapper(intersection_mapper)
intersection_actor.GetProperty().SetColor(0, 1, 0)
# 创建渲染器和渲染窗口
renderer = vtk.vtkRenderer()
renderer.AddActor(convex_actor)
renderer.AddActor(points_actor)
renderer.AddActor(edges_actor)
renderer.AddActor(intersection_actor)
renderer.SetBackground(0, 0, 0)
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window.SetSize(640, 480)
render_window.SetWindowName("Boolean Operation Visualization")
# 创建交互器和交互器样式
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
style = vtk.vtkInteractorStyleTrackballCamera()
interactor.SetInteractorStyle(style)
# 启动可视化
interactor.Initialize()
render_window.Render()
interactor.Start()
参考
(1) VTK笔记-图形相关-布尔运算-vtkBooleanOperationPolyDataFilter类 https://blog.csdn.net/liushao1031177/article/details/120230709
(2) VTK中的布尔运算——vtkBooleanOperationPolyDataFilter https://blog.csdn.net/jane_yuhui/article/details/52759012
(3) vtk 11 对图像进行布尔操作 https://blog.csdn.net/caomin1hao/article/details/81511301
vtkBooleanOperationPolyDataFilter的输入应该是vtkPolyData,而不是vtkAlgorithmOutput。更改布尔运算的输入行为:
boolean_operation.SetInputData(0, convex_hull.GetOutput())
boolean_operation.SetInputData(1, delaunay.GetOutput())
下面这段代码为什么还是没有得到图像。
def tu_pict(self):
if hasattr(self, 'df'):
points = self.df[["E", "N", "Z"]].values
points = np.array(points)
hull = vtk.vtkConvexHull2D()
hull.SetPoints(vtk.vtkPoints())
for point in points:
hull.AddPoint(point)
hull.Update()
polygon = vtk.vtkPolygon()
polygon.GetPointIds().SetNumberOfIds(hull.GetNumberOfVertices())
for i in range(hull.GetNumberOfVertices()):
polygon.GetPointIds().SetId(i, hull.GetPointIds().GetId(i))
polydata = vtk.vtkPolyData()
polydata.SetPoints(hull.GetPoints())
polydata.SetPolys(vtk.vtkCellArray())
polydata.GetPolys().InsertNextCell(polygon)
mapper = vtk.vtkPolyDataMapper()
if vtk.VTK_MAJOR_VERSION <= 5:
mapper.SetInput(polydata)
else:
mapper.SetInputData(polydata)
convex_actor = vtk.vtkActor()
convex_actor.SetMapper(mapper)
renderer = vtk.vtkRenderer()
renderer.AddActor(convex_actor)
renderer.SetBackground(1, 1, 1)
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
# 第二段代码:三角化得到三维体
x = self.df['E'].tolist()
y = self.df['N'].tolist()
z = self.df['Z'].tolist()
points = vtk.vtkPoints()
for i in range(len(x)):
points.InsertNextPoint(x[i], y[i], z[i])
polydata2 = vtk.vtkPolyData()
polydata2.SetPoints(points)
delaunay = vtk.vtkDelaunay3D()
delaunay.SetInputData(polydata2)
delaunay.Update()
triangulated_polydata = delaunay.GetOutput()
boolean_operation = vtk.vtkBooleanOperationPolyDataFilter()
boolean_operation.SetInputConnection(0, polydata.GetProducerPort())
boolean_operation.SetInputConnection(1, triangulated_polydata.GetProducerPort())
boolean_operation.SetOperationToIntersection()
boolean_operation.Update()
intersection_mapper = vtk.vtkPolyDataMapper()
intersection_mapper.SetInputData(boolean_operation.GetOutput())
intersection_actor = vtk.vtkActor()
intersection_actor.SetMapper(intersection_mapper)
intersection_actor.GetProperty().SetColor(0, 1, 0)
renderer.AddActor(intersection_actor)
render_window.SetSize(640, 480)
render_window.SetWindowName("Boolean Operation Visualization")
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
style = vtk.vtkInteractorStyleTrackballCamera()
interactor.SetInteractorStyle(style)
interactor.Initialize()
render_window.Render()
interactor.Start()
根据提供的代码段和参考资料,这是一个使用vtk库绘制体数据的管线的例子。
代码段中主要的步骤包括: 1. 导入vtk库并设置背景颜色。 2. 创建不透明传输函数和颜色传输函数,用于将灰度值映射成不透明度和颜色值。 3. 设置体数据属性,包括设置插值类型、颜色传输函数、不透明度传输函数、阴影、环境光系数、散射光系数和反射光系数等。 4. 创建vtkMetaImageReader,并设置读取的文件名。 5. 创建vtkImageCast,将reader的输出连接到cast的输入上,并将输出标量类型设置为unsigned char。 6. 创建vtkFixedPointVolumeRayCastMapper,并将cast的输出连接到volumeMapper的输入上。 7. 创建vtkVolume,并设置它的Mapper和Property。 8. 创建vtkRenderer,并将volume添加到ren1中,设置背景颜色,并设置摄像机的方位和高度等参数。 9. 创建vtkRenderWindow,并将ren1添加到renWin中,设置窗口的大小和位置。 10. 创建vtkRenderWindowInteractor,并将renWin设置为其RenderWindow,并开始交互。
如果在使用这段代码时出现了错误信息或警告,可以在错误信息或警告的基础上定位问题所在并作出相应的调整。
三维几何内核知识学习------布尔运算
可以参考下
https://blog.csdn.net/qq_38409301/article/details/124787157
https://blog.csdn.net/weixin_39959349/article/details/111065587
可能是由于布尔运算的结果没有正确设置导致、或者场景中的相机设置不正确导致、以及渲染设置不正确等方面的问题。
其次,如果场景中的点集很大,或者需要进行大量的布尔运算,可能会导致计算时间较长或渲染出现问题。可以尝试优化代码或减少点集数量等方式来解决此
有没有提示什么错误
# 点集得到三维体
points = self.df['E'].tolist()
points = [tuple([p[0], p[1], p[2]]) for p in points]
points = [p[0] for p in points]
points = [p[1] for p in points]
points = [p[2] for p in points]
points = np.array(points)
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)
convex_hull = vtk.vtkConvexHull2D()
convex_hull.SetInputData(polydata)
convex_mapper = vtk.vtkPolyDataMapper()
convex_mapper.SetInputConnection(convex_hull.GetOutputPort())
convex_actor = vtk.vtkActor()
convex_actor.SetMapper(convex_mapper)
convex_actor.GetProperty().SetColor(0.8, 0.8, 0.8)