当前位置: 首页 > news >正文

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()
http://www.gsyq.cn/news/118889.html

相关文章:

  • ExtractSelection 选择和提取数据集中的特定点,以及如何反转该选择
  • 小熊猫Dev-C++快速上手教程:零基础搭建C/C++开发环境
  • 无需重造轮子!Kotaemon提供开箱即用的RAG组件
  • TLS网络安全协议巩固知识基础题(5)
  • 再见 PotPlayer!更好用的开源播放器,来了
  • 基于GoFrame与微内核架构的企业级物联网平台设计与实现
  • 3步解锁Wallpaper Engine创意工坊:这款下载器如何让壁纸获取变得如此简单?
  • 图灵电子书全场限时折扣,新书老书同步参与!
  • Bypass Paywalls Clean终极指南:轻松绕过付费墙的5种简单方法
  • 嵌入式学习!(一)C++学习(16)入门-12/17
  • 5大付费墙绕过技术深度解析:Bypass Paywalls Clean终极使用指南
  • 中新全新医疗健康枢纽落户重庆,重庆鹏瑞利健康城项目启动 | 美通社头条
  • 百事可乐无糖推出全新草莓奶昔味产品
  • Springboot商洛市精准扶贫管理系统h906y(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 哔哩下载姬DownKyi:专业级B站视频内容管理解决方案深度解析
  • Redis 生产环境命令管控规范
  • PMOST管防反接功能
  • GKD自动化工具:解放双手的终极手机助手 [特殊字符]✨
  • 终极免费抽奖神器:Magpie-LuckyDraw全平台部署指南
  • 5-FAM,单一异构体,5-Carboxyfluorescein, 5-FAM, 单一异构体
  • Quasar 705 T Amidite,Quasar 705 T 核苷酸酰胺化试剂,化学特性
  • 百度贴吧用户脚本终极指南:告别繁琐操作,体验贴吧新境界
  • Unity RestClient 终极指南:告别回调地狱的异步网络编程
  • 驱动开发系列74 - GPU中的I2C
  • 思考与练习之答案与解析(第六章 程序控制结构)
  • 问财数据获取终极方案:Python量化分析新利器
  • 词库转换全攻略:告别输入法迁移困扰的终极解决方案
  • springboot甘肃非物质文化网站的设计与开发(11509)
  • Python包管理革命:在AI工作流中如何选择pip与uv
  • 基于SpringBoot的企业客户管理系统(11503)