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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

局域网与城域网(练习题)

局域网与城域网 ⭐️⭐️⭐️⭐️ 红色标记为答案⭐️⭐️⭐️⭐️ ⭐️⭐️⭐️ 蓝色标记为要点解析⭐️⭐️⭐️ 1.以下关于VLAN标记的说法中&#xff0c;错误的是&#xff08;&#xff09;。 A.交换机根据目标地址和VLAN标记进行转发决策 B.进入目的网段时&#xff0c;交换机…

C语言-atoi函数的模拟

模拟术语讲解 首先&#xff0c;需要定义一个标志位变量sign&#xff0c;用于表示转换结果的合法性1。定义一个函数My_atoi&#xff0c;用于实现atoi的功能1。在My_atoi函数中&#xff0c;首先遍历字符串&#xff0c;直到遇到第一个非空格字符1。如果第一个字符不是数字或正负号…

通讯录改造———文件版本

上一篇文章我们详细讲了文件操作&#xff0c;这时候我们就可以把通讯录保存到文件中&#xff0c;这样即使程序退出了&#xff0c;联系人的信息也还是保存着&#xff0c;下一次启动程序时我们就可以把文件中的数据读取到程序中来使用。 保存 首先我们要在退出通讯录之前把联系人…

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲&#xff0c;SpringBoot 在Spring生态基础上发展而来&#xff0c;它的发现不是取代Spring&#xff0c;是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

R语言,数据类型转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

IP地址与子网掩码

1 IP地址 1.1 IPv4与IPv6 1.2 IPv4地址详解 IPv4地址分4段&#xff0c;每段8位&#xff0c;共32位二进制数组成。 1.2.1 地址分类 这32位又被分为网络号和主机号两部分&#xff0c;根据网络号占用位数的不同&#xff0c;又可分为以下几类&#xff1a; A类地址&#xff1a;…

Higress 基于自定义插件访问 Redis

作者&#xff1a;钰诚 简介 基于 wasm 机制&#xff0c;Higress 提供了优秀的可扩展性&#xff0c;用户可以基于 Go/C/Rust 编写 wasm 插件&#xff0c;自定义请求处理逻辑&#xff0c;满足用户的个性化需求&#xff0c;目前插件已经支持 redis 调用&#xff0c;使得用户能够…

Windows提权—数据库提权-mysql提权mssql提权Oracle数据库提权

目录 Windows 提权—数据库提权一、mysql提权1.1 udf提权1.1.2 操作方法一 、MSF自动化--UDF提权--漏洞利用1.1.3 操作方法二、 手工导出sqlmap中的dll1.1.4 操作方法三、 moon.php大马利用 1.2 mof提权1.3 启动项提权1.4 反弹shell 二、MSSQL提权MSSQL提权方法1.使用xp_cmdshe…

Ps:阈值

阈值 Threshold命令可将灰度图像或彩色图像转换为仅包含黑色和白色的二值图像。 Ps菜单&#xff1a;图像/调整/阈值 Adjustments/Threshold Ps菜单&#xff1a;图层/新建调整图层/阈值 New Adjustment Layer/Threshold 阈值命令通过设置一个特定的亮度阈值&#xff08;阈值色阶…

深度解析:Elasticsearch检索请求原理

在上一篇文章中&#xff0c;我们学习了 Elasticsearch 的写入流程&#xff0c;今天我们来学习一下 Elasticsearch 的读取流程&#xff0c;当一个检索请求到达 Elasticsearch 之后是如何进行检索的呢&#xff1f; 下面先说一下一个总的检索流程。 1、客户端发送请求到任意一个…

企业能耗数据分析有哪些优势?怎样进行分析?

随着互联网技术的发展&#xff0c;企业在运营中会出现大量的用能数据&#xff0c;但却做不了精准的用能数据分析&#xff0c;导致数据没有得到有效利用&#xff0c;以及产生能源浪费现象。 为什么企业用能分析总是难&#xff1f; 一、用能分析过程复杂 由于用能分析过于复杂…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

读所罗门的密码笔记07_共生思想(中)

1. 在人工智能系统中建立信任 1.1. 人类的大脑容易被个人倾向、干扰因素和确认偏误所影响 1.2. 古莱说&#xff0c;然而&#xff0c;从不同的角度去思考事实、花更长时间来做决策的能力&#xff0c;可能会让人类拥有“密探”一般的智慧 1.3. 我们可以对决策进行批判性思考&a…

c语言----自定义类型---结构体(声明、重命名、对齐规则、传参、位段...详解)

目录 一、结构体类型的声明二、结构体的特殊声明三、结构体的重命名四、结构体的自引用五、结构体的内存对齐5.1对齐规则5.1.1练习 5.2为什么存在内存对齐?5.3 修改默认对齐数 六、结构体传参七、结构体实现位段7.1什么是位段7.2 位段的内存分配7.3 位段的跨平台问题7.4 位段的…

谷粒商城——通过接口幂等性防止重复提交订单

如果用户向后端服务提交多次相同订单的提交服务&#xff0c;那么后端应该只生成一条订单记录。 有一些操作天然是幂等的&#xff0c;如查询操作和删除操作等。 幂等性实现 1.token机制&#xff08;仅这个方法适用于订单的重复提交&#xff09; 后端先生成1个令牌将其记录在R…

智能停车场物联网远程监控解决方案

智能停车场物联网远程监控解决方案 智能停车场物联网远程监控解决方案是一种集成了现代物联网技术、大数据分析以及云计算等先进技术手段&#xff0c;对停车场进行全面智能化管理的综合系统。它通过实时感知、精准采集和高效传输各类停车数据&#xff0c;实现对停车场运营状态…

机器学习(四)

贝叶斯分类器与贝叶斯学习: 贝叶斯分类器:只要是一种生成式模型&#xff0c;并且使用到了贝叶斯公式 贝叶斯学习:一定在使用分布估计 贝叶斯分类器并不等于贝叶斯学习 极大似然估计: 先假设某种概率分布形式&#xff0c;再基于训练样例对参数进行估计 集成学习: 如何得到…

C#学习笔记 面试提要

冒泡 for (int m 0; m < arr.Length; m) { for (int n 0; n < arr.Length - 1 - m; n) { if (arr[n] > arr[n1]) { int temp arr[n]; arr[n] arr[n 1]; arr[n1] temp; } } } 选择 for (int m 0; m < arr.Length; m) { int index 0; for (int n 1; n < …

亿图图示如何绘制WBS分解?

什么是WBS分解&#xff1f; Wbs分解俗称工作分解结构法&#xff0c;就是把一个大项目按照原则分成多个小任务&#xff0c;再把每项小任务分解成具体的工作&#xff0c;然后把工作分到每人的工作中的一种分解方法。 如下图这里以开店KTV为例&#xff0c;项目是开店&#xff0c;小…

Unity UGUI之Text组件基础认识

Text组件用于在游戏中显示文本。 下面来细看下它的基本信息。 一、基本属性&#xff1a; 如上图所示&#xff0c;即为Text组件的一些基本属性&#xff0c;其中&#xff0c; Text&#xff1a;要显示的文本内容。Font&#xff1a;文本所使用的字体。Font Style&#xff08;字体…