news 2026/7/20 10:16:25

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ExtractPolyLinesFromPolyData切割一个三维模型(球体),并可视化切割后产生的多条等高线

一:主要的知识点

1、说明

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

2、知识点纪要

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


二:代码及注释

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()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 0:58:36

TLS网络安全协议巩固知识基础题(5)

1. TLS 1.3中的KeyUpdate消息如何实现密钥更新? 触发方式:任一方主动发送KeyUpdate消息 更新类型: update_not_requested:单向密钥更新 update_requested:请求对方也更新密钥 密钥派生:使用HKDF基于当前traffic secret生成新密钥 2. 解释TLS中的Padding扩展及其安全意义?…

作者头像 李华
网站建设 2026/7/16 22:35:02

基于Beego的轻量级功能权限管理系统设计与实现

基于Beego的轻量级功能权限管理系统设计与实现 基于Beego的轻量级功能权限管理系统:毕业设计源码与论文全解析 在当今数字化时代,权限管理系统已成为Web应用开发中不可或缺的核心组件。无论是企业后台管理系统、内部办公平台,还是SaaS服务&…

作者头像 李华
网站建设 2026/7/19 23:20:11

基于Golang与Vue3的全栈博客系统设计与实现

基于Golang与Vue3的全栈博客系统设计与实现 基于Golang与Vue3的全栈博客系统:毕业设计与学习实践的完美解决方案 在当今数字化时代,博客系统不仅是个人表达和知识分享的平台,更是全栈开发技术学习的绝佳案例。对于计算机科学和软件工程专业…

作者头像 李华
网站建设 2026/7/18 18:13:56

紧急缺人!年薪96万的新兴领域,强烈建议冲一冲

大家好,我是程序员小灰。不得不承认,最近一段时间大环境并不好。在互联网全面进入存量竞争、企业纷纷“降本增效”的大背景下,传统开发岗位的HC正在快速收缩……然而,传统程序员降薪、裁员的同时,AI相关技术岗位却在疯…

作者头像 李华
网站建设 2026/7/19 21:25:36

MOS 管栅极的 “充放电控制 + 可靠性

要分析这个UCC27244D 驱动 MOS 管 Q1电路中 R1、R3、D1、R2 的作用,需要结合 “栅极驱动的充放电、振荡抑制、可靠性” 这几个核心需求来看: 1. R1(100Ω):栅极串联电阻(核心作用是抑制振荡 + 限流) R1 串联在驱动器OUTA与 MOS 管 Q1 的栅极(G)之间,是栅极电阻,作…

作者头像 李华
网站建设 2026/7/20 7:12:58

ViGEmBus虚拟手柄驱动:从内核到应用的完整技术解析

ViGEmBus虚拟手柄驱动:从内核到应用的完整技术解析 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 在游戏外设兼容性领域,一个看似简单的问题困扰着无数玩家和开发者:如何让非标准手柄在Windows系…

作者头像 李华