关于#python#的问题:分别使用script得到三维体,然后再将这两个三维体进行布尔运算得到其交集,最后将交集得到的体显示出来,为什么这段代码并没有显示图像

使用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()
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7617317
  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的代码段和参考资料,这是一个使用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)