news 2026/4/26 0:39:32

AssignCellColorsFromLUT为每个单元格手动分配颜色的两种方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AssignCellColorsFromLUT为每个单元格手动分配颜色的两种方法

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①两种方法实现对网格面分配不同颜色


二:代码及注释

import vtkmodules.vtkInteractionStyle import vtkmodules.vtkRenderingOpenGL2 from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkFiltersSources import vtkPlaneSource from vtkmodules.vtkCommonCore import vtkLookupTable, vtkUnsignedCharArray from vtkmodules.vtkRenderingCore import ( vtkActor, vtkColorTransferFunction, vtkPolyDataMapper, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) from vtkmodules.vtkIOXML import ( vtkXMLPolyDataReader, vtkXMLPolyDataWriter ) def MakeLUT(tableSize): nc = vtkNamedColors() lut = vtkLookupTable() lut.SetNumberOfColors(tableSize) lut.Build() lut.SetTableValue(0, nc.GetColor4d("Black")) lut.SetTableValue(1, nc.GetColor4d("Banana")) lut.SetTableValue(2, nc.GetColor4d("Tomato")) lut.SetTableValue(3, nc.GetColor4d("Wheat")) lut.SetTableValue(4, nc.GetColor4d("Lavender")) lut.SetTableValue(5, nc.GetColor4d("Flesh")) lut.SetTableValue(6, nc.GetColor4d("Raspberry")) lut.SetTableValue(7, nc.GetColor4d("Salmon")) lut.SetTableValue(8, nc.GetColor4d("Mint")) lut.SetTableValue(9, nc.GetColor4d("Peacock")) return lut def MakeLUTFromCTF(tableSize): ctf = vtkColorTransferFunction() """ vtkColorTransferFunction 支持多种颜色插值空间, 可以理解为不同的颜色混合方式 | 函数 | 含义 | 说明 | | ---------------------------- | --------------- | ------------------------------ | | `SetColorSpaceToRGB()` | 在 RGB 空间插值 | 默认,直线混色(但有时色彩中间值偏灰) | | `SetColorSpaceToHSV()` | 在 HSV 空间插值 | 以色相方式混色,颜色过渡更平滑 | | `SetColorSpaceToDiverging()` | 在双向发散空间插值 | 用于“从中间值向两侧分化”的数据,比如温度偏差、差异、误差等 | | `SetColorSpaceToLab()` | 在感知均匀的 Lab 空间插值 | 颜色过渡更符合人眼感受 | """ ctf.SetColorSpaceToDiverging() ctf.AddRGBPoint(0.0, 0.085, 0.532, 0.201) ctf.AddRGBPoint(0.5, 0.865, 0.865, 0.865) ctf.AddRGBPoint(1.0, 0.677, 0.492, 0.093) # 建立ctf到lut的颜色映射 lut = vtkLookupTable() lut.SetNumberOfTableValues(tableSize) lut.Build() for i in range(0, tableSize): rgb = list(ctf.GetColor(float(i) / tableSize)) + [1] lut.SetTableValue(i, rgb) return lut def MakeCellData(tableSize, lut, colors): for i in range(tableSize): rgb = [0] * 3 lut.GetColor(float(i) / (tableSize - 1), rgb) ucrgb = list(map(int, [x * 255 for x in rgb])) colors.InsertNextTuple3(*ucrgb) def main(): nc = vtkNamedColors() resolution = 3 plane11 = vtkPlaneSource() plane11.SetXResolution(resolution) plane11.SetYResolution(resolution) plane11.Update() plane12 = vtkPlaneSource() plane12.SetXResolution(resolution) plane12.SetYResolution(resolution) plane12.Update() tableSize = max(resolution * resolution + 1, 10) # 通过LUT的颜色映射 lut1 = MakeLUT(tableSize) lut2 = MakeLUTFromCTF(tableSize) colorData1 = vtkUnsignedCharArray() colorData1.SetName("colors") colorData1.SetNumberOfComponents(3) MakeCellData(tableSize, lut1, colorData1) plane11.GetOutput().GetCellData().SetScalars(colorData1) colorData2 = vtkUnsignedCharArray() colorData2.SetName('colors') # Any name will work here. colorData2.SetNumberOfComponents(3) MakeCellData(tableSize, lut2, colorData2) plane12.GetOutput().GetCellData().SetScalars(colorData2) mapper11 = vtkPolyDataMapper() mapper11.SetInputConnection(plane11.GetOutputPort()) mapper11.SetScalarModeToUseCellData() mapper11.Update() mapper12 = vtkPolyDataMapper() mapper12.SetInputConnection(plane12.GetOutputPort()) mapper12.SetScalarModeToUseCellData() mapper12.Update() writer = vtkXMLPolyDataWriter() writer.SetFileName('pdlut.vtp') writer.SetInputData(mapper11.GetInput()) # This is set so we can see the data in a text editor. writer.SetDataModeToAscii() writer.Write() writer.SetFileName('pdctf.vtp') writer.SetInputData(mapper12.GetInput()) writer.Write() actor11 = vtkActor() actor11.SetMapper(mapper11) actor12 = vtkActor() actor12.SetMapper(mapper12) # Let's read in the data we wrote out. reader1 = vtkXMLPolyDataReader() reader1.SetFileName("pdlut.vtp") reader2 = vtkXMLPolyDataReader() reader2.SetFileName("pdctf.vtp") mapper21 = vtkPolyDataMapper() mapper21.SetInputConnection(reader1.GetOutputPort()) mapper21.SetScalarModeToUseCellData() mapper21.Update() actor21 = vtkActor() actor21.SetMapper(mapper11) mapper22 = vtkPolyDataMapper() mapper22.SetInputConnection(reader2.GetOutputPort()) mapper22.SetScalarModeToUseCellData() mapper22.Update() actor22 = vtkActor() actor22.SetMapper(mapper22) # Define viewport ranges. # (xmin, ymin, xmax, ymax) viewport11 = [0.0, 0.0, 0.5, 0.5] viewport12 = [0.0, 0.5, 0.5, 1.0] viewport21 = [0.5, 0.0, 1.0, 0.5] viewport22 = [0.5, 0.5, 1.0, 1.0] # Set up the renderers. ren11 = vtkRenderer() ren12 = vtkRenderer() ren21 = vtkRenderer() ren22 = vtkRenderer() # Setup the render windows renWin = vtkRenderWindow() renWin.SetSize(600, 600) renWin.SetWindowName('AssignCellColorsFromLUT'); renWin.AddRenderer(ren11) renWin.AddRenderer(ren12) renWin.AddRenderer(ren21) renWin.AddRenderer(ren22) ren11.SetViewport(viewport11) ren12.SetViewport(viewport12) ren21.SetViewport(viewport21) ren22.SetViewport(viewport22) ren11.SetBackground(nc.GetColor3d('MidnightBlue')) ren12.SetBackground(nc.GetColor3d('MidnightBlue')) ren21.SetBackground(nc.GetColor3d('MidnightBlue')) ren22.SetBackground(nc.GetColor3d('MidnightBlue')) ren11.AddActor(actor11) ren12.AddActor(actor12) ren21.AddActor(actor21) ren22.AddActor(actor22) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) renWin.Render() iren.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 21:39:00

3分钟搞定TRAE配置:Maven效率提升全攻略

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 生成一个对比报告:1) 传统手动配置TRAEMaven的典型步骤和时间消耗 2) 使用快马平台AI生成的配置步骤和时间消耗 3) 两种方式产生的配置内容差异分析 4) 常见问题的自动…

作者头像 李华
网站建设 2026/4/25 18:26:19

2025年优秀CRM客户管理系统推荐:6款主流产品全面评测

2025年优秀CRM客户管理系统推荐:6款主流产品全面评测在数字化转型背景下,CRM(客户关系管理)已从“销售工具”升级为“企业增长引擎”。企业选型CRM的核心诉求,是打通全流程数据、提升销售效率、实现数据驱动决策。本文…

作者头像 李华
网站建设 2026/4/20 20:25:05

传统监控 vs HERTZBEAT:效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个对比演示项目,展示HERTZBEAT与传统监控工具在相同服务器环境下的性能差异。包括自动配置时间、CPU/内存占用率、告警响应时间等指标。使用Kimi-K2模型优化监控…

作者头像 李华
网站建设 2026/4/19 21:59:00

【Azure容器部署避坑宝典】:10年架构师总结的6大失败案例解析

第一章:Azure容器部署的核心挑战与现状在现代云原生架构中,Azure 容器部署已成为企业实现敏捷开发与高效运维的关键路径。然而,随着微服务规模扩大和部署频率提升,开发者面临一系列核心挑战,包括资源调度效率、网络策略…

作者头像 李华
网站建设 2026/4/22 0:54:59

NGINX极简入门:5分钟搭建你的第一个Web服务器

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个交互式NGINX新手教程应用,通过分步引导的方式帮助用户完成首个NGINX服务器的搭建。功能包括:基础安装指导、配置文件可视化编辑器(带实…

作者头像 李华
网站建设 2026/4/19 22:40:45

游戏开发者必看:彻底解决玩家MSVCP140.DLL报错问题

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个游戏运行环境检测工具,专门针对MSVCP140.DLL等常见运行库缺失问题。工具应能检测VC运行库安装状态,提供一键安装功能,生成详细的诊断报…

作者头像 李华