ExtractPolyLinesFromPolyData切割一个三维模型(球体),并可视化切割后产生的多条等高线

一:主要的知识点

1、说明

本文只是教程内容的一小段,因博客字数限制,故进行拆分。主教程链接:vtk教程------逐行解析官网所有Python示例-CSDN博客

2、知识点纪要

本段代码主要涉及的有①着色方式,②vtkStripper的作用

二:代码及注释

python 复制代码
import vtkmodules.vtkRenderingOpenGL2
from vtkmodules.vtkCommonColor import vtkNamedColors
from vtkmodules.vtkCommonCore import vtkIdList
from vtkmodules.vtkCommonDataModel import vtkPlane
from vtkmodules.vtkFiltersCore import vtkCutter, vtkStripper
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkRenderingCore import (
    vtkActor,
    vtkPolyDataMapper,
    vtkRenderWindow,
    vtkRenderWindowInteractor,
    vtkRenderer
)


def main():
    colors = vtkNamedColors()

    lineColor = colors.GetColor3d("peacock")
    modeColor = colors.GetColor3d("silver")
    backgroundColor = colors.GetColor3d("wheat")

    modelSource = vtkSphereSource()

    plane = vtkPlane()

    cutter = vtkCutter()
    cutter.SetCutFunction(plane)
    cutter.SetInputConnection(modelSource.GetOutputPort())
    """
    cutter如何去切取决去vtkPlane设置的平面的法向量
    如果设置的平面的法向量为(0,0,1) 则表示切割球体的平面为平行于XY平面。
    -0.5, 0.5表示这个平面从-0.5的z值高度,沿着法向量的方向一直移动到0.5,中间取10个值
    """
    cutter.GenerateValues(10, -0.5, 0.5)

    modelMapper = vtkPolyDataMapper()
    modelMapper.SetInputConnection(modelSource.GetOutputPort())

    model = vtkActor()
    model.SetMapper(modelMapper)
    model.GetProperty().SetDiffuseColor(modeColor)
    """
    SetInterpolationToFlat 将模型的着色方式设置为平面着色
    当启用平面着色时,VTK 会对每个多边形(如三角形或四边形)使用一个单一的、统一的颜色来填充。这意味着:
    着色(Shading):每个面片的颜色是恒定的,从一个顶点到另一个顶点不会有渐变。
    光照(Lighting):光照计算只会在每个面片的中心进行一次,然后整个面片都用这个颜色来渲染。
    """
    model.GetProperty().SetInterpolationToFlat()

    """
    vtkStripper 的作用是把 线段或三角形片元 按照拓扑关系合并成更长的 polyline(折线)或 triangle strip(三角带)。
    没有 vtkStripper 的话,vtkCutter 切出来的结果可能是一堆独立的小线段。
    加上 vtkStripper,这些小线段如果端点连续,就会被自动拼接成更长的线条,更利于渲染或后续处理
    """
    stripper = vtkStripper()
    stripper.SetInputConnection(cutter.GetOutputPort())
    """
    JoinContiguousSegmentsOn  决定 vtkStripper 是否把 首尾相接的线段
    """
    stripper.JoinContiguousSegmentsOn()

    linesMapper = vtkPolyDataMapper()
    linesMapper.SetInputConnection(stripper.GetOutputPort())

    lines = vtkActor()
    lines.SetMapper(linesMapper)
    lines.GetProperty().SetDiffuseColor(lineColor)
    lines.GetProperty().SetLineWidth(3.)

    renderer = vtkRenderer()
    renderWindow = vtkRenderWindow()

    renderWindow.AddRenderer(renderer)
    renderWindow.SetSize(640, 480)
    renderWindow.SetWindowName('ExtractPolyLinesFromPolyData')

    interactor = vtkRenderWindowInteractor()
    interactor.SetRenderWindow(renderWindow)

    # Add the actors to the renderer.
    renderer.AddActor(model)
    renderer.AddActor(lines)
    renderer.SetBackground(backgroundColor)
    renderer.GetActiveCamera().Azimuth(-45)
    renderer.GetActiveCamera().Elevation(-22.5)
    renderer.ResetCamera()

    # This starts the event loop and as a side effect causes an
    # initial render.
    renderWindow.Render()
    interactor.Start()

    # 获取线条的数目
    numberOfLines = cutter.GetOutput().GetNumberOfLines()
    print('-----------Lines without using vtkStripper')
    print('There are {0} lines in the polydata'.format(numberOfLines))

    numberOfLines = stripper.GetOutput().GetNumberOfLines()
    points = stripper.GetOutput().GetPoints()
    cells = stripper.GetOutput().GetLines()
    cells.InitTraversal() # 重置遍历器,将内部的迭代器指针移到第一个单元的位置
    print('-----------Lines using vtkStripper')
    print('There are {0} lines in the polydata'.format(numberOfLines))

    indices = vtkIdList()
    lineCount = 0
    while cells.GetNextCell(indices):  # 类比于for cell in cells:
        #  indices 里现在就是当前 cell 的点索引
        print('Line {0}:'.format(lineCount))
        for i in range(indices.GetNumberOfIds()):
            point = points.GetPoint(indices.GetId(i))
            print('\t({0:0.6f} ,{1:0.6f}, {2:0.6f})'.format(point[0], point[1], point[2]))
        lineCount += 1

if __name__ == '__main__':
    main()
相关推荐
曦月逸霜3 小时前
啥是RAG 它能干什么?
人工智能·python·机器学习
2301_769340673 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
南 阳5 小时前
Python从入门到精通day66
开发语言·python
m0_596749095 小时前
JavaScript中手动实现一个new操作符的底层逻辑
jvm·数据库·python
DTAS尺寸公差分析软件5 小时前
DTAS3D v13.0 三维尺寸公差分析软件可申请试用
python·尺寸公差分析·三维公差分析·公差仿真软件·尺寸链计算
DTAS尺寸公差分析软件5 小时前
DTAS 3D公差分析软件最新版本介绍
python·3d·尺寸公差分析·尺寸链计算·尺寸工程·尺寸链校核软件·公差仿真分析
PieroPc5 小时前
CAMWATCH — 局域网摄像头监控系统 Fastapi + html
前端·python·html·fastapi·监控
feasibility.5 小时前
反爬十层妖塔:现代爬虫攻防的立体战争
爬虫·python·科技·scrapy·rust·go·硬件
十八旬6 小时前
快速安装ClaudeCode完整指南
开发语言·windows·python·claude
dFObBIMmai6 小时前
如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响
jvm·数据库·python