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

第05章 11 动量剖面可视化代码一则

在计算流体力学(CFD)中,动量剖面(Momentum Profiles)通常用于描述流体在流动方向上的动量分布。在 VTK 中,可以通过读取速度场数据,并计算和展示动量剖面来可视化呈现速度场信息。

示例代码

以下是一个示例代码,展示如何使用 VTK 和 C++ 读取速度场数据,并计算和可视化动量剖面。

#include <vtkSmartPointer.h>
#include <vtkXMLImageReader.h>
#include <vtkImageData.h>
#include <vtkPointData.h>
#include <vtkDataArray.h>
#include <vtkFloatArray.h>
#include <vtkDoubleArray.h>
#include <vtkMath.h>
#include <vtkPointLocator.h>
#include <vtkPolyData.h>
#include <vtkCellArray.h>
#include <vtkLine.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkNamedColors.h>
#include <vtkProperty.h>
#include <vtkCamera.h>int main(int argc, char *argv[])
{if (argc < 2){std::cerr << "Usage: " << argv[0] << " <InputVelocityFile.vti>" << std::endl;return EXIT_FAILURE;}// 读取速度场数据vtkSmartPointer<vtkXMLImageDataReader> reader = vtkSmartPointer<vtkXMLImageDataReader>::New();reader->SetFileName(argv[1]);reader->Update();vtkSmartPointer<vtkImageData> imageData = reader->GetOutput();// 获取速度数组vtkSmartPointer<vtkDoubleArray> velocityArray = vtkDoubleArray::SafeDownCast(imageData->GetPointData()->GetVectors());if (!velocityArray){std::cerr << "No velocity vectors found in the input data." << std::endl;return EXIT_FAILURE;}// 定义剖面线的起点和终点double startPoint[3] = {0.0, 0.0, 0.0};double endPoint[3] = {1.0, 0.0, 0.0};// 创建剖面线的点数组vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();// 创建点定位器vtkSmartPointer<vtkPointLocator> locator = vtkSmartPointer<vtkPointLocator>::New();locator->SetDataSet(imageData);locator->BuildLocator();// 采样点的数量int numberOfSamples = 100;// 计算剖面线上的点for (int i = 0; i <= numberOfSamples; i++){double t = static_cast<double>(i) / numberOfSamples;double point[3];for (int j = 0; j < 3; j++){point[j] = startPoint[j] * (1.0 - t) + endPoint[j] * t;}points->InsertNextPoint(point);}// 查找最近的图像数据点vtkIdType ptId;double closestPoint[3];vtkSmartPointer<vtkDoubleArray> momentumArray = vtkSmartPointer<vtkDoubleArray>::New();momentumArray->SetNumberOfComponents(1);momentumArray->SetName("Momentum");for (vtkIdType i = 0; i < points->GetNumberOfPoints(); i++){points->GetPoint(i, closestPoint);ptId = locator->FindClosestPoint(closestPoint);double velocity[3];velocityArray->GetTuple(ptId, velocity);double momentum = vtkMath::Dot(velocity, velocity); // 假设密度为1,动量等于速度的平方momentumArray->InsertNextValue(momentum);}// 创建剖面线的PolyDatavtkSmartPointer<vtkPolyData> profileLine = vtkSmartPointer<vtkPolyData>::New();profileLine->SetPoints(points);// 创建线单元vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();for (int i = 0; i < numberOfSamples; i++){line->GetPointIds()->SetId(0, i);line->GetPointIds()->SetId(1, i + 1);lines->InsertNextCell(line);}profileLine->SetLines(lines);profileLine->GetPointData()->AddArray(momentumArray);// 创建LookupTablevtkSmartPointer<vtkLookupTable> lookupTable = vtkSmartPointer<vtkLookupTable>::New();lookupTable->SetHueRange(0.667, 0.0); // 从蓝到红的渐变lookupTable->SetSaturationRange(1.0, 1.0);lookupTable->SetValueRange(1.0, 1.0);lookupTable->SetTableRange(momentumArray->GetRange());lookupTable->Build();// 创建Mapper和ActorvtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputData(profileLine);mapper->SetScalarModeToUsePointData();mapper->SetColorModeToMapScalars();mapper->SelectColorArray("Momentum");mapper->SetScalarRange(momentumArray->GetRange());vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->GetProperty()->SetLineWidth(3.0);// 创建Renderer, RenderWindow, InteractorvtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();renderer->AddActor(actor);renderer->SetBackground(0.1, 0.2, 0.4); // 设置背景色vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);renderWindow->SetSize(800, 600);vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 设置相机renderer->GetActiveCamera()->SetPosition(0, 0, 1);renderer->GetActiveCamera()->SetFocalPoint(0, 0, 0);renderer->GetActiveCamera()->SetViewUp(0, 1, 0);renderer->ResetCamera();// 开始渲染和交互renderWindow->Render();interactor->Start();return EXIT_SUCCESS;
}


代码说明

  1. 读取速度场数据:使用 vtkXMLImageDataReader 读取速度场的 VTI 文件。
  2. 获取速度数组:从图像数据的点数据中获取速度向量数组。
  3. 定义剖面线:定义剖面线的起点和终点,以及采样点的数量。
  4. 采样剖面线上的点:在剖面线上均匀采样点,并使用 vtkPointLocator 查找图像数据中最近的点。
  5. 计算动量:对于每个采样点,获取对应的速度向量,并计算动量(这里假设密度为1,动量等于速度的平方)。
  6. 创建剖面线的PolyData:将采样点和动量数据组织成PolyData,包含点、线单元和动量数组。
  7. 创建LookupTable:设置颜色查找表,根据动量值从蓝色到红色渐变。
  8. 创建Mapper和Actor:使用PolyData创建Mapper,并设置颜色映射。创建Actor并设置线宽。
  9. 渲染和交互:设置Renderer、RenderWindow和Interactor,配置相机,并开始渲染和交互。

编译和运行

确保你已经安装了 VTK 库,并正确配置了开发环境。编译和运行代码时,需要提供速度场数据文件作为命令行参数。

g++ -std=c++11 -o momentum_profiles momentum_profiles.cpp -lvtkCommonCore-9.0 -lvtkCommonDataModel-9.0 -lvtkIOXML-9.0 -lvtkImagingCore-9.0 -lvtkRenderingContext2D-9.0 -lvtkRenderingCore-9.0 -lvtkRenderingFreeType-9.0 -lvtkRenderingOpenGL2-9.0 -lvtkInteractionStyle-9.0
./momentum_profiles /path/to/velocity/file.vti


注意事项

  1. 速度场数据:确保输入的 VTI 文件包含速度向量数据。
  2. 剖面线定义:可以根据需要定义不同的剖面线,例如在不同方向上采样。
  3. 动量计算:本示例中假设密度为1,动量等于速度的平方。实际应用中,可能需要根据具体物理模型调整动量的计算公式。
  4. 性能优化:对于大规模数据,剖面线的采样点数可能需要调整,以平衡可视化质量和计算效率。

输出结果

运行程序后,你将看到一个交互式窗口,窗口中显示剖面线上的动量分布。剖面线的颜色从蓝色到红色表示动量值的变化。可以通过交互式窗口进行缩放和旋转,以更好地观察剖面线的动量分布情况。

相关文章:

第05章 11 动量剖面可视化代码一则

在计算流体力学&#xff08;CFD&#xff09;中&#xff0c;动量剖面&#xff08;Momentum Profiles&#xff09;通常用于描述流体在流动方向上的动量分布。在 VTK 中&#xff0c;可以通过读取速度场数据&#xff0c;并计算和展示动量剖面来可视化呈现速度场信息。 示例代码 以…...

MySQL的复制

一、概述 1.复制解决的问题是让一台服务器的数据与其他服务器保持同步&#xff0c;即主库的数据可以同步到多台备库上&#xff0c;备库也可以配置成另外一台服务器的主库。这种操作一般不会增加主库的开销&#xff0c;主要是启用二进制日志带来的开销。 2.两种复制方式&#xf…...

Cpp::IO流(37)

文章目录 前言一、C语言的输入与输出二、什么是流&#xff1f;三、C IO流C标准IO流C文件IO流以写方式打开文件以读方式打开文件 四、stringstream的简单介绍总结 前言 芜湖&#xff0c;要结束喽&#xff01; 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是 …...

基于OpenCV实现的答题卡自动判卷系统

一、图像预处理 🌄 二、查找答题卡轮廓 📏 三、透视变换 🔄 四、判卷与评分 🎯 五、主函数 六、完整代码+测试图像集 总结 🌟 在这篇博客中,我将分享如何使用Python结合OpenCV库开发一个答题卡自动判卷系统。这个系统能够自动从扫描的答题卡中提取信…...

如何将电脑桌面默认的C盘设置到D盘?详细操作步骤!

将电脑桌面默认的C盘设置到D盘的详细操作步骤&#xff01; 本博文介绍如何将电脑桌面&#xff08;默认为C盘&#xff09;设置在D盘下。 首先&#xff0c;在D盘建立文件夹Desktop&#xff0c;完整的路径为D:\Desktop。winR&#xff0c;输入Regedit命令。&#xff08;或者单击【…...

二十三种设计模式-享元模式

享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享相同对象来减少内存使用&#xff0c;尤其适合在大量重复对象的情况下。 核心概念 享元模式的核心思想是将对象的**可共享部分&#xff08;内部状态&#xff09;提取出来进行共…...

算法【有依赖的背包】

有依赖的背包是指多个物品变成一个复合物品&#xff08;互斥&#xff09;&#xff0c;每件复合物品不要和怎么要多种可能性展开。时间复杂度O(物品个数 * 背包容量)&#xff0c;额外空间复杂度O(背包容量)。 下面通过题目加深理解。 题目一 测试链接&#xff1a;[NOIP2006 提…...

A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战

服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…...

飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由(如何解决OVS网桥绑定失败以及打开ovs后无法访问飞牛nas等问题)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 飞牛NAS虚拟机安装爱快教程 📒🛠️ 前期准备🌐 网络要求💾 下载爱快镜像🚀 开始安装💻 开启IOMMU直通🌐 配置网络🚨 解决OVS网桥绑定失败以及打开ovs后无法访问飞牛nas等问题➕ 创建虚拟机🎯 安装ikuai💻 进…...

蓝桥杯例题四

每个人都有无限潜能&#xff0c;只要你敢于去追求&#xff0c;你就能超越自己&#xff0c;实现梦想。人生的道路上会有困难和挑战&#xff0c;但这些都是成长的机会。不要被过去的失败所束缚&#xff0c;要相信自己的能力&#xff0c;坚持不懈地努力奋斗。成功需要付出汗水和努…...

八股——Java基础(四)

目录 一、泛型 1. Java中的泛型是什么 ? 2. 使用泛型的好处是什么? 3. Java泛型的原理是什么 ? 什么是类型擦除 ? 4.什么是泛型中的限定通配符和非限定通配符 ? 5. List和List 之间有什么区别 ? 6. 可以把List传递给一个接受List参数的方法吗&#xff1f; 7. Arra…...

CVE-2023-38831 漏洞复现:win10 压缩包挂马攻击剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 影响范围 防御措施 复现步骤 环境准备 具体操作 前言 在网络安全这片没有硝烟的战场上&#xff0c;新型漏洞如同隐匿的暗箭&#xff0c;时刻威胁着我们的数字生活。其中&#xff0c;CVE - 2023 - 38831 这个关联 Win10 压缩包挂…...

【自然语言处理(NLP)】深度循环神经网络(Deep Recurrent Neural Network,DRNN)原理和实现

文章目录 介绍深度循环神经网络&#xff08;DRNN&#xff09;原理和实现结构特点工作原理符号含义公式含义 应用领域优势与挑战DRNN 代码实现 个人主页&#xff1a;道友老李 欢迎加入社区&#xff1a;道友老李的学习社区 介绍 **自然语言处理&#xff08;Natural Language Pr…...

Linux 命令之技巧(Tips for Linux Commands)

Linux 命令之技巧 简介 Linux ‌是一种免费使用和自由传播的类Unix操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布。Linux继承了Unix以网络为核心的设计思想&#xff0c;是一个性能稳定的多用户…...

【文星索引】搜索引擎项目测试报告

目录 一、项目背景二、 项目功能2.1 数据收集与索引2.2 API搜索功能2.3 用户体验与界面设计2.4 性能优化与维护 三、测试报告3.1 功能测试3.2 界面测试3.3 性能测试3.4 兼容性测试3.5 自动化测试 四、测试总结4.1 功能测试方面4.2 性能测试方面4.3 用户界面测试方面 一、项目背…...

低代码系统-产品架构案例介绍、轻流(九)

轻流低代码产品定位为零代码产品&#xff0c;试图通过搭建来降低企业成本&#xff0c;提升业务上线效率。 依旧是从下至上&#xff0c;从左至右的顺序 名词概述运维层底层系统运维层&#xff0c;例如上线、部署等基础服务体系内置的系统能力&#xff0c;发消息、组织和权限是必…...

二叉树(补充)

二叉树 1.二叉树的基本特性2.堆2.1.堆的基本概念2.2.堆的实现2.2.1.基本结构2.2.2.堆的初始化 2.2.3.堆的销毁2.2.4.堆的插入2.2.5.取出堆顶的数据2.2.6.堆的删除2.2.7.堆的判空2.2.8.堆的数据个数2.2.9.交换2.2.10.打印堆数据2.2.11.堆的创建2.2.12.堆排序 1.二叉树的基本特性…...

(DM)达梦数据库基本操作(持续更新)

1、连接达梦数据库 ./disql 用户明/"密码"IP端口或者域名 2、进入某个模式&#xff08;数据库,因达梦数据库没有库的概念&#xff0c;只有模式&#xff0c;可以将模式等同于库&#xff09; set schema 库名&#xff1b; 3、查表结构&#xff1b; SELECT COLUMN_NAM…...

CRM 微服务

文章目录 项目地址一、项目地址 教程作者:教程地址:代码仓库地址:所用到的框架和插件:dbt airflow一、 用户与认证服务 主要功能: 用户注册、登录、注销。 认证(OAuth、JWT 等)。 权限和角色管理(RBAC/ABAC)。 单点登录(SSO)。 技术亮点: 集成第三方身份认证(如 …...

AI软件外包需要注意什么 外包开发AI软件的关键因素是什么 如何选择AI外包开发语言

1. 定义目标与需求 首先&#xff0c;要明确你希望AI智能体做什么。是自动化任务、数据分析、自然语言处理&#xff0c;还是其他功能&#xff1f;明确目标可以帮助你选择合适的技术和方法。 2. 选择开发平台与工具 开发AI智能体的软件时&#xff0c;你需要选择适合的编程语言、…...

技术深度解析:logitech-pubg项目实现PUBG后坐力控制的Lua脚本架构设计

技术深度解析&#xff1a;logitech-pubg项目实现PUBG后坐力控制的Lua脚本架构设计 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 在竞技射击游戏…...

Qwen3-VL-2B实战:快速搭建一个能“看懂”图片的智能聊天机器人

Qwen3-VL-2B实战&#xff1a;快速搭建一个能"看懂"图片的智能聊天机器人 1. 项目介绍与核心能力 1.1 什么是视觉语言模型 视觉语言模型&#xff08;Vision-Language Model&#xff09;是一种能够同时理解图像和文本的AI技术。不同于传统聊天机器人只能处理文字&am…...

一个防止GPT“降智”的简单方法

GPT客户端容易“降智”&#xff1f;教你一个简单解决办法 正文 最近一直感觉 GPT 手机客户端有点“降智”&#xff0c;回答质量不太稳定。 后来我拿同一账号做了对比&#xff0c;发现用手机浏览器登录网页版时&#xff0c;整体会正常不少&#xff0c;所以来给大家分享一下。 我…...

港科喜讯|[港科百创]参赛项目上市!视觉语言大模型第一股诞生!

2026年3 月 30 日&#xff0c;山东极视角科技股份有限公司&#xff08;股票代码&#xff1a;6636.HK&#xff09;在香港联合交易所主板正式上市。这家曾斩获香港科技大学第六届百万奖金国际创业大赛深圳赛区一等奖的科创企业&#xff0c;同时也是香港科大"创科行"(第…...

不止是打字机效果:手把手教你用SpannableStringBuilder打造Android富文本AI对话界面

超越基础文本渲染&#xff1a;用SpannableStringBuilder构建专业级AI对话界面 在移动应用开发中&#xff0c;AI对话界面的用户体验往往决定了产品的专业度。传统的TextView虽然能显示文字&#xff0c;但要实现类似DeepSeek等专业AI产品的交互效果&#xff0c;需要深入掌握Andro…...

nli-distilroberta-base实际项目:新闻摘要与原文蕴含关系自动评估

nli-distilroberta-base实际项目&#xff1a;新闻摘要与原文蕴含关系自动评估 1. 项目概述 在新闻媒体和内容创作领域&#xff0c;如何快速评估一篇摘要是否准确反映了原文内容一直是个挑战。传统的人工审核方式效率低下且成本高昂。nli-distilroberta-base项目正是为解决这一…...

OpenClaw技能扩展:千问3.5-35B-A3B-FP8驱动的内容生成与发布

OpenClaw技能扩展&#xff1a;千问3.5-35B-A3B-FP8驱动的内容生成与发布 1. 为什么选择OpenClaw千问3.5做内容自动化 去年冬天&#xff0c;当我第一次尝试用AI自动化完成公众号内容生产时&#xff0c;经历了典型的"缝合怪"工作流&#xff1a;ChatGPT生成初稿→Midj…...

开源大模型部署案例:Pixel Language Portal镜像免配置快速上手教程

开源大模型部署案例&#xff1a;Pixel Language Portal镜像免配置快速上手教程 1. 产品概览 Pixel Language Portal&#xff08;像素语言跨维传送门&#xff09;是一款基于Tencent Hunyuan-MT-7B大模型构建的创新翻译工具。与传统翻译软件不同&#xff0c;它将语言转换过程设…...

Python原生AOT编译2026架构设计图(含C-API二进制兼容性矩阵+GC停顿压缩至≤80μs实证)

第一章&#xff1a;Python原生AOT编译2026架构全景概览Python原生AOT&#xff08;Ahead-of-Time&#xff09;编译在2026年已演进为一套融合语言语义、运行时契约与硬件感知能力的系统级基础设施。它不再依赖传统解释器或JIT中间态&#xff0c;而是通过静态类型推导、控制流图全…...

vue3 diff算法中的-双端 Diff + 最长递增子序列 讲解

一句话总结 Vue3 Diff 双端比较&#xff08;快速复用&#xff09; 最长递增子序列&#xff08;最小移动 DOM&#xff09; 目的&#xff1a;在乱序节点中&#xff0c;只移动最少 DOM&#xff0c;实现最高效更新。1. 先搞懂&#xff1a;Vue3 对比 Vue2 差在哪&#xff1f; Vue2…...