VTK中polydata的属性数据结构表示和用法

  vtk中通过vtkDataArray进行数据的存储,通过vtkDataObject进行可视化数据的表达,在vtkDataObject内部有一个vtkFieldData的实例,负责对数据的表达:

                                        

 vtkFieldData存储数据的属性数据,该数据是对拓扑结构和几何结构信息的补充。属性数据可以是某个空间点的温度或某个单元的质量等。在vtk中与数据集的点数据相关联的属性数据用vtkPointData表达,与单元数据相关联的属性数据用vtkCellData表达。

其属性内容都用vtkDataArray来存储,如<vtkDoubleArray>来存储某个空间点或者几何结构的某个属性。

例子1,几何结构点point对象的属性设置:

  • 实例化一个 vtkUnstructuredGrid 对象 unStructGrid
  • 设置节点序列信息 cells 和单元序列信息 points
  • 需要渲染节点属性信息时,通过预先设置好的节点属性信息Scalars 进行赋值,并且通过 SetScalarModeToUsePointData() 方法设置 mapper 只显示节点属性
unStructGrid->GetPointData()->SetScalars(Scalars);
ugridMapper->SetScalarModeToUsePointData();

例子2,拓扑结构cell对象的属性设置:

需要渲染单元属性信息时,通过事先设置好的单元属性信息Scalars 进行赋值,并且通过 SetScalarModeToUseCellData() 方法设置 mapper 只显示单元属性

unStructGrid->GetCellData()->SetScalars(Scalars); 
ugridMapper->SetScalarModeToUseCellData();

例子3,这里说明了如何创造并将数据写入一个属性数组scalars:

    // 创建一个属性数组scalars,存放点的属性vtkSmartPointer<vtkDoubleArray> scalars = vtkSmartPointer<vtkDoubleArray>::New();
// 填充点云数据(示例数据)double point[3] = { 0.0, 0.0, 0.0 };double pixel;for (int k = 0; k < dims[2]; k++)// dims[2]; k++){for (int j = 0; j < dims[1]; j++)//dims[1]; j++){for (int i = 0; i < dims[0]; i++){pixel = imageData->GetScalarComponentAsDouble(i, j, k, 0);//获取组分作为属性数据if (pixel > 0){point[0] = i;       //X轴横坐标point[1] = j;       //Y轴纵坐标point[2] = pixel;     //Z轴高度vtkIdType pId[1];       //定义用来存储点的坐标的中间变量,vtkIdType相当int long等类型points->InsertNextPoint(point);     //把点坐标加入VTKPoints中,InserNextPoint()返回加入这些point点依次在VTKPoints中的索引;                   pId[0] = points->InsertNextPoint(point);        //获取要插入cell的pint点的坐标数据。vertics->InsertNextCell(1, pId);        //将VTKPoints的内容加入拓扑结构cell中,这里每将point点加入VTKPoints一次,就将这个VTKPoints加入cell一次。vtkCellArray::InsertNextCell ( vtkIdType npts, vtkIdType * pts )的第一个参数值标是这个cell中点的个数,第二个参数指向那些点的坐标数据。vtkIdType *pts,存储的是所包括点在points中的顺序信息,其个数当然应该和前面的npts一致。这里,2点可以连成一条线,三点可以得到一个面。//也就是说:vtk中关于点、线、面的那些信息都是存放在cellarray中,应用时也是直接对cellarray指针进行处理,数据的写入和读取在vtkCellArray类完成。scalars->InsertNextValue(pixel);    //属性数组scalars,用来存放点属性polydata->SetPoints(points);//加入三维点polydata->SetVerts(vertics);//加入三维点的点索引//还是需要标量scalars来表示高度,并用这个标量进行映射// // scalars->InsertTuple1(i, pixel);//这个格式好像不对//  //polydata->GetPointData()->SetScalars(scalars);//加入点属性//cout << "高度scalars=" << scalars << endl;}}}}

——————————————

数据属性是简单的vtkDataArray类型,它可以是标量scalar,向量vector,张量tensor,法向normal,纹理坐标texture coordinate,全局id (global id,如标识大量元素),或者pedigreeids(用来追踪管线中的元素历史)。

vtkDataSet中的一个点或者单元都有独立的属性数据。数据属性可以关联vtkDataSet中的点或者单元。与vtkDataSet关联的vtkDataArray都是vtkDataArray的一个具体子类,例如vtkFloatArray或者vtkIntArray。这些数据数组可以看做连续的、线性的内存块。在内存块中,数据数组可以看作由子数组或者“元组”(Tuple)组成。创建属性数据即是根据类型实例化数组内存,制定元组大小,插入数据并与数据集关联:

这里创建了三种类型的属性数据,float,double和int。第一个数组scalars实例化后,默认的元组大小为1。

InsertTuple1()方法用来向数组中插入数据(所有Insert___()方法负责分配足够的内存来保存数据)。

下一个数组vectors的元组数为3,因此vectors定义为含有三个分量,InsertTuple3用来向数组中添加数据。

最后创建的是元组数为2的数组,通过SetNumberOfTuples()分配内存。

接着通过SetTuple2()添加数据;该方法使用的前提是内存已经分配,因此速度要明显快于Insert__()方法。

当将属性数据关联到点数据或者单元数据时,注意区别设置类型的方法(SetScalars()和SetVectors())。注意点属性个数必须与数据结构中的点个数一致,单元属性与数据结构的单元个数一致。

————————

采用如下方法访问属性数据:

set scalars [[polyData GetPointData] GetScalars]
set vectors [[polyData GetCellData] GetVectors]

许多的Filter需要专门的属性数据进行工作。例如,vtkElevationFilter依赖于相应的高度数据产生标量值。其他的Filter只依赖于结构数据,并忽略传来的属性数据。还有一些Filter需要结构数据和属性数据来工作,如vtkMarchingCubes。它利用输入的标量属性数据和结构数据来产生轮廓结构。其他类型的属性数据,例如向量,在计算轮廓时进行差值计算并输出。

——————————————————

颜色映射(ColorMapping)

最常用的可视化技术可能是通过标量值或者颜色映射来对物体着色。着色技术的思想比较简单,将标量值映射到一个颜色查找表来获取颜色,然后在渲染时使用颜色来改变点或者单元的外观。在阅读本节前,请先理解怎样控制Actor的颜色(详见54页“Actor颜色”一节)。

VTK中颜色映射主要由用户生成或者数据文件中的标量数据和vtkMapper实例执行颜色映射使用的颜色查询表来控制。也可以使用任意的数据数组通过ColorByArrayComponent()方法来控制。如果没有指明,Mapper会生成一个默认的颜色查询表,你也可以自己创建(下例摘自VTK/Examples/Rendering/Tcl/Rainbow.tcl,运行结果如图5-1所示):

如该例所示,操作查询表有两种方式。一是指定一个HSVA范围然后在HSVA空间中插值计算颜色表中颜色(实际由build()函数计算颜色)。第二种方法是在根据颜色表的位置人为指定颜色。注意颜色表中的颜色数目可以设置。本例中利用HSVA范围生成颜色表,然后利用SetTableValue()函数替换掉相应的颜色。

Mapper的SetScalarRange()函数控制标量值与颜色表的映射方式。大于最大值的所有标量值都被映射为最大值,小于最小值的所有标量值都映射为最小值。标量范围设置,可以通过在某一数据范围内映射更多的颜色来达到“扩展”的目的。

很多情况下标量数据就是颜色值,这样就不需要通过颜色查找表进行映射。

——————————————————————————————————

在 VTK中,数据集的几何数据表示为Points (点集),拓扑关系表示为Cell(单元),属性数据包括Scalar(标量)、Vector(向量)、Normal(法线)、Texture(纹理)等。

image

在VTK中数据集的类型主要按构成数据集的几何数据和单元来划分,主要的数据集类型包括:Structured Points(结构化点集)【vtkStructuredPoints 的父类是vtkImageData】、Unstructured Points (非结构化点集)、Poly Data(多边形数据集)、Structured Grid(结构化网格数据集)、Unstructured Grid(非结构化网格数据集)、Rectilinear Grid(线性网格数据集)等几大类,各类的表现形式如下图所示。

image

image

image

image

(1) Structured Points

按规则排列的点的集合。点的排列和坐标轴平行,形成方形的点阵。vtkStructuredPoints 的父类是vtkImageData,vtkImageData是vtkDataSet的子类。

(2) Unstructured Points

不规则地分布在空间的点集。非结构化点集具有不规则的几何结构,但不具有拓扑结构,用离散点来表达,通常,这类数据没有固定的结构,是由一些可视化程序识别和创建的。

(3) Poly Data

在VTK中多边形数据集是由顶点、多顶点、线、多线、多边形各三角带构成,多边形数据是非结构化的,并且多边形数据集的单元在拓扑维度上有多种变化,顶点、线和多边形构成了用来表达0、1和2维几何图形的基本要素的最小集合,同时用多顶点、多线和三角形带单元来提高效率和性能,特别是用一个三角形带表达N个三角形只需要用N+2个点,但是用传统的表达方法需要用3N个点。vtkPolyData的父类是vtkPointSet,vtkPointSet是vtkDataSet的子类。

(4) Structured Grid

具有规则的拓扑结构和不规则的几何结构,但是单元没有重叠或交叉。vtkStructuredGrid的父类是vtkPointSet。

(5) Unstructured Grid

非结构化网格集是最常见的数据集类型,它的拓扑结构和几何结构都是非结构化的,在此数据集中所有单元类型都可以组成任意组合,所以单元的拓扑结构从零维延伸至三维,在 VTK中任一类型的数据集都可用非结构化网格来表达。vtkUnstructuredGrid的父类是vtkPointSet。

(6)  Rectilinear Grid

是排列在矩形方格中的点和单元的集合,线性网格的拓扑结构是规则的,但其几何结构只有一部分是规则的,也就是说,它的点是沿着坐标轴排列的,但是两点间的间隔可能不同。vtkRectilinearGrid的父类是vtkDataSet。

3.可视化数据集部分的 VTK类列表

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299351.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity自定义框架(1)-----------单例模式

前言&#xff1a; Unity作为一款强大的游戏开发引擎&#xff0c;其基础框架的设计对于项目的结构和性能有着重要的影响。其中&#xff0c;单例模式是一种常用的设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 什么是单例模式&#xff1f…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面&#xff0c;异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式&#xff1b; 1.利用trycatchfinaly语句处理异常&#xff0c;优点是分开了处理异常代码和程序正常代码…

Jenkins (三) - 拉取编译

Jenkins (三) - 拉取编译 通过Jenkins平台 git 拉取github上项目&#xff0c;通过maven编译并打包。 Jenkins 安装 git 插件 Manager Jenkins -> Plugins -> Available plugins -> Git 打包编译检验 FressStyle 风格编译 New Item输入 item name Spring-Cloud-1…

【机器学习300问】60、图像分类任务中,训练数据不足会带来什么问题?如何缓解图像数据不足带来的问题?

在机器学习中&#xff0c;绝大部分模型都需要大量的数据进行训练和学习&#xff08;包括有监督学习和无监督学习&#xff09;&#xff0c;然而在实际应用中经常会遇到训练数据不足的问题。就比如图像分类这样的计算机视觉任务&#xff0c;确实依赖于大规模且多样化的训练数据以…

出门一笑, “栈” 落江横 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

代码随想录算法训练营Day46|LC139 单词拆分

一句话总结&#xff1a;完全背包&#xff01; 原题链接&#xff1a;139 单词拆分 动态规划之完全背包五部曲&#xff1a; 确定dp数组与下标含义&#xff1a;表示字符串长度为i时&#xff0c;dp[i] true 的话&#xff0c;可以拆分为一个或多个在字典中出现的单词。确定递归公…

K8S基于containerd做容器从harbor拉取镜

实现创建pod时&#xff0c;通过指定harbor仓库里的镜像来运行pod 检查&#xff1a;K8S是不是用containerd做容器运行时&#xff0c;以及containerd的版本是不是小于1.6.22 kubectl get nodes -owide1、如果containerd小于 1.6.22&#xff0c;需要先升级containerd 先卸载旧的…

RabbitMQ3.13.x之六_RabbitMQ使用场景

RabbitMQ3.13.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.13.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ&#xff1f;1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ&#xff1f; RabbitMQ 是一个可靠且…

dm8 备份与恢复

dm8 备份与恢复 基础环境 操作系统&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本&#xff1a;DM Database Server 64 V8 架构&#xff1a;单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…

【教程】宝塔default.db占用空间几十g解决方法|宝塔占用磁盘空间特别大解决方法|宝塔磁盘被占满怎么清理

目录 一、前言二、排查问题三、解决方法 一、前言 用过宝塔创建网站&#xff0c;大家应该都非常熟悉&#xff0c;但是用随着用的时间越来越多&#xff0c;宝塔所占用的空间也越来越多&#xff0c;不停的加大数据盘都没有用&#xff0c;我原先买了30G够用了&#xff0c;随着时间…

docker-ce部署

目录 1. 更新软件包列表 2. 安装必要的软件包&#xff0c;以允许 apt 使用 HTTPS 3. 添加 Docker 的官方 GPG 密钥 4. 设置 Docker CE 的稳定存储库 5. 再次更新包索引以及安装 Docker CE 6. 验证 Docker CE 是否正确安装 7. 将当前用户添加到 docker 用户组&#xff0c;…

智慧牧场数据 7

1 体征数据采集 需求:获取奶牛记步信息 三轴加速度测量&#xff1a;加速度测量计反应的加速向量与当前的受力方向是相反&#xff0c;单位为g 陀螺仪&#xff0c;是用来测量角速度的&#xff0c;单位为度每秒&#xff08;deg/s&#xff09; 2000deg/s 相当于1秒钟多少转 1.1…

苹果终止电车项目后大裁员,押注家用机器人,这会是Next Big Thing吗?

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 新的出路&#xff0c;苹果能让我们耳目一新吗&#xff1f; 苹果公司压力山大&#xff0c;何以…

彩虹聚合DNS管理系统v1.0全新发布

聚合DNS管理系统&#xff08;https://github.com/netcccyun/dnsmgr&#xff09;可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&#xff0c;每个用户可分配不同的…

【JSON2WEB】 12基于Amis-admin的动态导航菜单树

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

Day:004(1) | Python爬虫:高效数据抓取的编程技术(数据解析)

数据解析-正则表达式 在前面我们已经搞定了怎样获取页面的内容&#xff0c;不过还差一步&#xff0c;这么多杂乱的代码夹杂文字我们怎样 把它提取出来整理呢&#xff1f;下面就开始介绍一个十分强大的工具&#xff0c;正则表达式&#xff01; 正则表达式是对字符串操作的一种…

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…

不同设备使用同一个Git账号

想要在公司和家里的电脑上用同一个git账号来pull, push代码 1. 查看原设备的用户名和邮箱 第1种方法&#xff0c; 依次输入 git config user.name git config user.email第2种方法&#xff0c; 输入 cat ~/.gitconfig2. 配置新设备的用户名和邮箱 用户名和邮箱与原设备保持…

vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示

由于分辨率不同会导致文本内容显示不全&#xff0c;如下所示&#xff1a; 因此需要 1、悬浮到对应行上出现悬浮信息 实现代码如下所示&#xff1a; 这里只演示Vue3版本代码&#xff0c;Vue2版本不再演示 区别就在插槽使用上Vue3使用&#xff1a;#default“”&#xff1b;Vu…

网络安全教学

如今&#xff0c;组织的信息系统和数据面临着许多威胁。而人们了解网络安全的所有基本要素是应对这些威胁的第一步。 网络安全是确保信息完整性、机密性和可用性(ICA)的做法。它代表了应对硬盘故障、断电事故&#xff0c;以及来自黑客或竞争对手攻击等防御和恢复能力。而后者包…