news 2026/5/23 23:28:15

OverlappingAMR 创建并可视化一个 “分层自适应网格” 数据集,粗网格表示大范围区域,高分辨率用于重要区域

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OverlappingAMR 创建并可视化一个 “分层自适应网格” 数据集,粗网格表示大范围区域,高分辨率用于重要区域

一:主要的知识点

1、说明

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

2、知识点纪要

本段代码主要涉及的有①vtkOverlappingAMR分层多块的数据容器,存储不同分辨率的结构化网格


二:代码及注释

import vtkmodules.vtkRenderingOpenGL2 import vtkmodules.vtkInteractionStyle from vtkmodules.vtkCommonColor import vtkNamedColors from vtkmodules.vtkCommonDataModel import vtkOverlappingAMR, vtkUniformGrid, vtkAMRBox, vtkSphere from vtkmodules.vtkCommonCore import vtkFloatArray from vtkmodules.vtkFiltersModeling import vtkOutlineFilter from vtkmodules.vtkFiltersCore import vtkContourFilter from vtkmodules.vtkFiltersGeometry import vtkCompositeDataGeometryFilter from vtkmodules.vtkRenderingCore import ( vtkActor, vtkPolyDataMapper, vtkRenderWindow, vtkRenderWindowInteractor, vtkRenderer ) def MakeScalars(dims, origin, spacing, scalars): sphere = vtkSphere() sphere.SetRadius(3) sphere.SetCenter(5, 5, 5) scalars.SetNumberOfTuples(dims[0] * dims[1] * dims[2]) for k in range(0, dims[2]): z = origin[2] + spacing[2] * k for j in range(0, dims[1]): y = origin[1] + spacing[1] * j for i in range(0, dims[0]): x = origin[0] + spacing[0] * i # 使用扁平索引(Flattened Index, 即一维数组索引)将计算得到的标量值存入 scalars 数组中 scalars.SetValue(k * dims[0] * dims[1] + j * dims[0] + i, sphere.EvaluateFunction(x, y, z)) def main(): colors = vtkNamedColors() """ vtkOverlappingAMR 是一个 分层多块(multi-level, multi-block)数据容器, 用于存储具有**不同空间分辨率(refinement ratio)**的结构化网格(vtkUniformGrid)。 它能表示那种 “部分区域加密、其他地方保持粗糙” 的数据 """ amr = vtkOverlappingAMR() blockPerLevel = [1, 2] """ vtkOverlappingAMR 分多层级,每一层级对应一种分辨率,且每一层可包含多个vtkUniformGrid 各层之间的网格可以部分重叠,本身不保存网格数据,只是一个层次组织器,真正的数据存在每个 block的vtkUniformGrid中 """ amr.Initialize(2, blockPerLevel) # 这段代码表示有两个层级,第0个层级1个粗网格,第2个层级2个细化网格 origin = [0, 0, 0] spacing = [1.0, 1.0, 1.0] dims = [11, 11, 11] """ vtkUniformGrid 是 VTK 中非常核心的一个数据结构之一, 它代表的是一种 规则结构化网格(Uniform Structured Grid), 在科学计算和体数据(Volume Data)可视化中非常常见 是一种 规则三维网格数据类型,其中所有单元的大小(spacing)相同,点的位置由 origin + spacing × index 自动计算出来 可以看作是 vtkImageData 的“更通用版本”,允许你显式设置单元和点的数据,而不仅限于图像 """ ug1 = vtkUniformGrid() ug1.SetSpacing(spacing) ug1.SetOrigin(origin) ug1.SetDimensions(dims) scalars = vtkFloatArray() MakeScalars(dims, origin, spacing, scalars) ug1.GetPointData().SetScalars(scalars) """ vtkAMRBox 在使用vtkOverlappingAMR时,vtkAMRBox 是其中最核心的“空间描述单元” 简单说,它是一个包围盒(bounding box),定义了该块在整个 AMR 层级结构中覆盖的网格区域范围。 """ box1 = vtkAMRBox([0, 0, 0], [9, 9, 9]) #lo / hi 表示该块在索引空间中的范围(10×10×10 个单元格) amr.SetAMRBox(0, 0, box1) amr.SetDataSet(0, 0, ug1) spacing2 = [0.5, 0.5, 0.5] ug2 = vtkUniformGrid() ug2.SetOrigin(origin) ug2.SetSpacing(spacing2) ug2.SetDimensions(dims) scalars2 = vtkFloatArray() MakeScalars(dims, origin, spacing2, scalars2) ug2.GetPointData().SetScalars(scalars2) lo2 = [0, 0, 0] hi2 = [9, 9, 9] box2 = vtkAMRBox(lo2, hi2) amr.SetAMRBox(1, 0, box2) amr.SetDataSet(1, 0, ug2) origin3 = [5, 5, 5] ug3 = vtkUniformGrid() # Geometry ug3.SetOrigin(origin3) ug3.SetSpacing(spacing2) ug3.SetDimensions(dims) # Data scalars3 = vtkFloatArray() ug3.GetPointData().SetScalars(scalars3) MakeScalars(dims, origin3, spacing2, scalars3) lo3 = [10, 10, 10] hi3 = [19, 19, 19] box3 = vtkAMRBox(lo3, hi3) amr.SetAMRBox(1, 1, box3) amr.SetDataSet(1, 1, ug3) amr.SetRefinementRatio(0, 2) # SetRefinementRatio Level1网格的体素尺寸将是Level0的网格体素尺寸尺寸的1/2 of = vtkOutlineFilter() of.SetInputData(amr) # geomFilter = vtkCompositeDataGeometryFilter() # geomFilter.SetInputConnection(of.GetOutputPort()) cf = vtkContourFilter() cf.SetInputData(amr) cf.SetNumberOfContours(1) cf.SetValue(0, 10.0) geomFilter2 = vtkCompositeDataGeometryFilter() geomFilter2.SetInputConnection(cf.GetOutputPort()) # Create the render window, renderer, and interactor. aren = vtkRenderer() renWin = vtkRenderWindow() renWin.AddRenderer(aren) iren = vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # Associate the geometry with a mapper and the mapper to an actor. mapper = vtkPolyDataMapper() mapper.SetInputConnection(of.GetOutputPort()) actor1 = vtkActor() actor1.GetProperty().SetColor(colors.GetColor3d('Yellow')) actor1.SetMapper(mapper) # Associate the geometry with a mapper and the mapper to an actor. mapper2 = vtkPolyDataMapper() mapper2.SetInputConnection(geomFilter2.GetOutputPort()) actor2 = vtkActor() actor2.SetMapper(mapper2) # Add the actor to the renderer and start handling events. aren.AddActor(actor1) aren.AddActor(actor2) aren.SetBackground(colors.GetColor3d('CornflowerBlue')) renWin.SetWindowName('OverlappingAMR') renWin.Render() iren.Start() if __name__ == '__main__': main()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 12:18:55

MATLAB优化VRPTW规划问题:基于蚁群算法的解决方案

MATLAB采用蚁群算法解决VRPTW规划问题VRPTW(带时间窗的车辆路径问题)这玩意儿在实际物流场景里能把人逼疯——既要控制成本又得满足客户时间要求。今天咱们用MATLAB整点有意思的,试试用蚁群算法来干这个活。先来点直观的算法设定:…

作者头像 李华
网站建设 2026/5/19 13:09:10

LangFlow HTTPS安全访问配置指南

LangFlow HTTPS安全访问配置指南 在AI应用快速迭代的今天,越来越多团队开始使用可视化工具来构建大语言模型(LLM)工作流。LangFlow 就是其中的佼佼者——它让开发者无需编写大量代码,就能通过拖拽节点的方式设计复杂的LangChain流…

作者头像 李华
网站建设 2026/5/21 2:28:54

Dify企业级实战深度解析 (18)

一、学习目标作为系列课程高级企业场景深化篇,本集聚焦 “智能客服 多渠道协同 工单闭环” 核心需求,核心目标是掌握DifyDeepseek 智能客服的多渠道接入、意图精准识别、复杂问题处理与工单系统深度集成:从多渠道统一管理到智能分流&#x…

作者头像 李华
网站建设 2026/5/7 2:38:14

LangFlow后端服务架构设计:Flask+SocketIO组合优势

LangFlow后端服务架构设计:Flask与SocketIO的协同之道 在AI应用开发门槛日益降低的今天,如何让非专业开发者也能快速构建基于大语言模型(LLM)的工作流系统,成为了一个关键命题。LangFlow正是这一趋势下的代表性开源项目…

作者头像 李华