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

第01章 19 通过点数据逐级构建球体体数据的综合性小例子

用VTK库来创建一个三维图像数据(vtkImageData),并填充标量数据以表示一个球体的体数据。球的半径为50,体数据的空间间隔为1.0/1000。

首先,我需要包含VTK的头文件,并且创建一个vtkImageData对象。然后,我将设置图像数据的维度、原点和间距。接下来,我将创建一个vtkFloatArray来存储标量数据,并通过遍历每个体素来计算其到球心的距离,并根据距离确定标量值。

以下是一个示例代码:

#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkFloatArray.h>
#include <vtkXMLImageDataWriter.h>int main()
{// 创建vtkImageData对象vtkSmartPointer<vtkImageData> vol = vtkSmartPointer<vtkImageData>::New();// 设置图像数据的维度int dims[3] = {1000, 1000, 1000};vol->SetDimensions(dims);// 设置图像数据的原点double origin[3] = {-50.0, -50.0, -50.0};vol->SetOrigin(origin);// 设置图像数据的间距double spacing[3] = {1.0 / 1000.0, 1.0 / 1000.0, 1.0 / 1000.0};vol->SetSpacing(spacing);// 创建标量数组vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New();scalars->SetNumberOfComponents(1);scalars->SetNumberOfTuples(dims[0] * dims[1] * dims[2]);// 计算标量值double x, y, z;double center[3] = {0.0, 0.0, 0.0}; // 球心位置double radius = 50.0; // 球的半径for (int k = 0; k < dims[2]; k++){z = origin[2] + k * spacing[2];for (int j = 0; j < dims[1]; j++){y = origin[1] + j * spacing[1];for (int i = 0; i < dims[0]; i++){x = origin[0] + i * spacing[0];double distance = sqrt((x - center[0]) * (x - center[0]) +(y - center[1]) * (y - center[1]) +(z - center[2]) * (z - center[2]));int index = i + j * dims[0] + k * dims[0] * dims[1];scalars->SetTuple1(index, distance - radius);}}}// 设置标量数据到图像数据vol->GetPointData()->SetScalars(scalars);// 可选:保存图像数据到文件vtkSmartPointer<vtkXMLImageDataWriter> writer = vtkSmartPointer<vtkXMLImageDataWriter>::New();writer->SetFileName("sphereImageData.vti");writer->SetInputData(vol);writer->Write();return 0;
}

解释

  1. 创建vtkImageData对象

    • 使用vtkSmartPointer<vtkImageData>创建图像数据对象。
    • 设置维度为1000x1000x1000。
    • 设置原点为(-50.0, -50.0, -50.0)。
    • 设置间距为(1.0/1000, 1.0/1000, 1.0/1000)。
  2. 创建标量数组

    • 使用vtkSmartPointer<vtkFloatArray>创建浮点型数组。
    • 设置数组的组件数为1,并设置元组数为维度的乘积。
  3. 填充标量数据

    • 通过三重循环遍历每个体素。
    • 计算每个体素的坐标(x, y, z)。
    • 计算该点到球心的距离,并减去半径,得到标量值。
    • 将标量值设置到数组中相应的索引位置。
  4. 设置标量数据到图像数据

    • 将标量数组设置为图像数据的点数据的标量数组。
  5. 保存图像数据

    • 可选步骤,使用vtkXMLImageDataWriter将图像数据保存为.vti文件。

这个代码将生成一个表示球体的三维图像数据,其中标量值表示每个体素到球心的距离减去半径,可以用于等值面提取或其他体数据处理操作。

http://www.lryc.cn/news/526778.html

相关文章:

  • CVE-2024-23897-Jenkins任意文件读取漏洞复现
  • 前端react后端java实现提交antd form表单成功即导出压缩包
  • 基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础
  • 接口(完)
  • 数据结构——实验七·排序
  • JVM堆空间
  • 【详细】SSH公私钥认证与渗透测试攻击场景
  • 常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)
  • C++异步future
  • Oracle 12c 中的 CDB和PDB的启动和关闭
  • Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向
  • chrome插件:网页图片高清下载
  • 汽车定速巡航
  • CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)
  • WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel
  • 14-6-2C++STL的list
  • 【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型
  • 私域流量池构建与转化策略:以开源链动2+1模式AI智能名片S2B2C商城小程序为例
  • vofa++使用方法
  • LogicFlow 一款流程图编辑框架
  • HTML<kbd>标签
  • PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(上.文章部分)
  • 150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究
  • 深入浅出 SQLSugar:快速掌握高效 .NET ORM 框架
  • ESP8266 NodeMCU与WS2812灯带:实现多种花样变换
  • MacOS安装Docker battery-historian
  • Linux的基本指令(上)
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.1 从零搭建NumPy环境:安装指南与初体验
  • ASP .NET Core 学习(.NET9)部署(一)windows
  • 百日计划(2025年1月22日-4月30日,以完成ue4.0 shader抄写为目标)