VTK----VTK数据结构详解2(计算机篇)

在VTK中,属性数据和点都用数据数组(data arrays)表示。某些属性数据(例如法线、张量)需要具有与其定义一致的元组(在计算机编程中,元组(tuple)用来表示存储多种数据类型的有序值集。元组中的各个值以逗号分隔,例如“(2.0, 3.4, 5.0)”是一个三元组的示例)大小,例如,点、向量和法线需要元组大小为3的数据数组;张量的元组大小为9(即3x3矩阵)。标量对元组大小没有任何要求。

1 数据数组(vtkDataArray)

考虑数据的大小和范围,必须谨慎管理内存以创建高效的可视化系统。在VTK中,使用连续数据数组(continuous data arrays)作为大多数数据结构的基础。与其他数据结构(例如链表或指向结构体的指针数组)相比,连续数组的创建、删除和遍历速度更快。

VTK中决定用数据数组而非对象数组(例如,为单元和点使用单独的类)的原因是,对象的构造和析构是有性能成本的。从性能的角度看,面向对象的方法适用在应用程序层,而不是在实现层。

连续数组也可以轻松地通过网络传输,特别是如果数组中的信息是与计算机地址无关的内容。内存独立性避免了将信息从一个内存位置映射到另外一个内存位置的开销。因此,在VTK中,根据“id”(索引)访问信息。数组数组(vtkDataArray)默认的偏移量是0,就像C++数组一样。也就是说,给定了n个数据值,使用id(0、1、2、...、n-1)依次访问这些值。下图是VTK中连续数组vtkFloatArray的实现。

array是指向内存的指针。数组的长度由Size给出。数组是动态的,因此尝试插入超出分配大小的数据会自动做Resize()处理。MaxId是一个整数偏移量,定义插入数据的结尾。如果未插入任何数据,则MaxId等于-1,否则,MaxId是一个整数值,0 ≤ MaxId ≤ Size。

2 数据元组

许多可视化数据由多个组件定义。x-y-z坐标三元组或RGBA颜色像素值就是两个这样的例子。为了在连续的数据数组中表示此类数据,引入了元组。如下图所示,连续数组被分组为具有NumberOfComponents个组件的较小的子数组,这些子数组称为元组。

3 数据对象(vtkDataObject)

vtkDataObject是可视化数据的通用表示,其派生的子类从VTK: vtkDataObject Class Reference中的类图可以看到。很少有算法直接对数据对象进行操作,大多数算法都需要指定数据的组织结构才能处理,数据集(vtkDataSet)是其中一个例子,其指定了数据的组织结构,其类图如下:

在VTK中实现了五种数据集:vtkPolyData, vtkImageData, vtkStructuredGrid, vtkRectilinearGrid, and vtkUnstructuredGrid. 非结构化的点数据集没有被现实,但是它能使用vtkPolyData或者vtkUnstructuredGrid来表示。

VTK对每种数据集类型使用了不同的内部数据表示。通过使用不同的的表示,可以最大限度地减少数据结构内存需求并实现高效的访问方法。本来可以使用vtkUnstructuredGrid来表示所有数据集类型,但对于大数据来说,内存和计算开销是不可接受的。

vtkPolyData

与vtkImageData和vtkStructuredGrid不同,vtkPolyData的拓扑结构不规则,因此必须明确地表示数据集的拓扑结构和几何形状。vtkPolyData中的点数据使用vtkPoints类表示。

VTK中使用vtkCellArray来表示单元的拓扑结构,该类是每个单元的连接列表,列表的结构是一串整数(如下图),列表中的第一个数字是计数,下一个数字序列是单元连接。

(连接列表中的每个数字都是点坐标列表实例的索引。)计数序列后跟连接列表,重复进行,直到枚举每个单元。vtkCellArray还维护列表中的单元数和列表中的当前位置(用于遍历)等其他信息。

单元的类型(参见VTK----VTK数据结构详解(几何篇)-CSDN博客)信息不直接表示在vtkPolyData中,而是通过维护四个单独的列表来间接表示,这四个单独的列表分别表示顶点(vertices)、线(lines)、多边形(polygons)和三角形带(triangle strips)。顶点列表表示类型为vtkVertex和vtkPolyVertext的单元。线列表表示为类型vtkLine和vtkPolyLine的单元。多边形列表表示类型为vtkTriangle、vtkQuad和vtkPolygon的单元。三角形带列表表示为vtkTriangleStrip的单元。因此,单元类型可以从定义单元的特定列表及其定义单元的点数中得知。这四个单元列表还将单元分为0维、1维和2维类型。这很有用,因为可视化算法通常会以不同的方式处理不同拓扑顺序的数据。

vtkUnstructuredGrid

就表示拓扑结构和几何形状的能力而言,vtkUnstructuredGrid数据集类型是最通用的。点和单元都使用vtkPoints和vtkCellArray的派生类明确表示。vtkUnstructuredGrid类与vtkPolyData类类似,不同之处在于vtkUnstructuredGrid必须能够表示所有单元类型,而不仅仅是vtkPolyData的有限图形类型(即顶点、线、三角形和三角形带)。

vtkUnstructuredGrid的另一个显著特征是以不同的方式表示类型信息。在vtkPolyData中,将单元分为四个单独的列表,从而间接的表示单元的类型。在vtkUnstructuredGrid中,添加了附加类vtkCellType来明确表示单元类型。

vtkCellTypes是一个补充信息数组。对于每个单元,一个整数标志定义单元类型。另一个变量用于记录单元在对应的vtkCellArray中的位置。(如下图)

除了表示单元类型之外,此设计还支持对单元的随机访问。由于单元连接列表的长度各不相同,因此vtkCellArray无法在不从原点开始遍历其数据结构的情况下找到特定的单元。但是,使用添加的vtkCellTypes类,可以通过使用偏移(offset)值直接访问单元。

vtkCellTypes也可以添加到vtkPolyData数据表示中——事实上已经这样做了。但是,添加的原因不是为了表示单元类型,而是为了提供对单元的随机访问并启用许多拓扑操作。

以下是vtkUnstructuredGrid能表示的所有单元类型:

  // These are all the cells that vtkUnstructuredGrid can represent. Used by// GetCell() (and similar) methods.vtkVertex* Vertex;vtkPolyVertex* PolyVertex;vtkBezierCurve* BezierCurve;vtkBezierQuadrilateral* BezierQuadrilateral;vtkBezierHexahedron* BezierHexahedron;vtkBezierTriangle* BezierTriangle;vtkBezierTetra* BezierTetra;vtkBezierWedge* BezierWedge;vtkLagrangeCurve* LagrangeCurve;vtkLagrangeQuadrilateral* LagrangeQuadrilateral;vtkLagrangeHexahedron* LagrangeHexahedron;vtkLagrangeTriangle* LagrangeTriangle;vtkLagrangeTetra* LagrangeTetra;vtkLagrangeWedge* LagrangeWedge;vtkLine* Line;vtkPolyLine* PolyLine;vtkTriangle* Triangle;vtkTriangleStrip* TriangleStrip;vtkPixel* Pixel;vtkQuad* Quad;vtkPolygon* Polygon;vtkTetra* Tetra;vtkVoxel* Voxel;vtkHexahedron* Hexahedron;vtkWedge* Wedge;vtkPyramid* Pyramid;vtkPentagonalPrism* PentagonalPrism;vtkHexagonalPrism* HexagonalPrism;vtkQuadraticEdge* QuadraticEdge;vtkQuadraticTriangle* QuadraticTriangle;vtkQuadraticQuad* QuadraticQuad;vtkQuadraticPolygon* QuadraticPolygon;vtkQuadraticTetra* QuadraticTetra;vtkQuadraticHexahedron* QuadraticHexahedron;vtkQuadraticWedge* QuadraticWedge;vtkQuadraticPyramid* QuadraticPyramid;vtkQuadraticLinearQuad* QuadraticLinearQuad;vtkBiQuadraticQuad* BiQuadraticQuad;vtkTriQuadraticHexahedron* TriQuadraticHexahedron;vtkTriQuadraticPyramid* TriQuadraticPyramid;vtkQuadraticLinearWedge* QuadraticLinearWedge;vtkBiQuadraticQuadraticWedge* BiQuadraticQuadraticWedge;vtkBiQuadraticQuadraticHexahedron* BiQuadraticQuadraticHexahedron;vtkBiQuadraticTriangle* BiQuadraticTriangle;vtkCubicLine* CubicLine;vtkConvexPointSet* ConvexPointSet;vtkPolyhedron* Polyhedron;vtkEmptyCell* EmptyCell;

4 数据属性

数据属性与数据集的结构相关联。数据集模型建立在点和单元上,因此将数据属性与点和单元关联起来也很自然而然。(与点关联的属性称为点属性,与单元关联的属性称为单元属性)中间结构(例如单元边或面)没有明确的类型表示,所以无法轻松将数据属性与它们进行关联。数据属性的设计基于以下原理:

  • 数据采集和数值模拟系统通常在点位置或单元中心位置测量和/或计算结果。
  • 边界属性信息(例如,在边或面上的)可以作为单元的数据进行保存,并根据单元的拓扑结构进行排序。
  • VTK的数据模型基于点和单元的原因是基于内存和性能考虑的。在单元边界上表示属性数据需要做扩展,以支持少数需要支持单元边界上关联属性数据的情况。如果将来需要更复杂的数据结构来表示边界属性数据,最好将其封装到单个类中,而不是在整个系统中强制抽象。

维护单元数据和点数据表示的一个困难是数据中可能出现不一致。例如,如果单元的标量值是0.5,而其点的标量值不是0.5,那么哪个时正确的?可以设计优先级方案来解决这种情况。VTK中使用vtkPointData和vtkCellData表示数据属性,它们都是vtkFieldData的子类。vtkDataSetAttributes类用于协调数据从一个过程对象到另一个过程对象的移动。它提供了在输入(input)和输出(output)之间的复制、插入和移动数据的方法。

vtkDataSetAttributes类的另一个重要特性是它提供了分配数据数组来表示特定数据属性的能力。例如,方法SetScalars()用于指定哪个数据数组将被视为字段中的标量。

每个数据集点与其属性数据之间存在一一对应关系。点属性通过点ID访问。例如,要访问数据集实例aDataSet中点ID 129的标量值,如下:

DataSet -> GetPointData ()-> GetScalars ()-> GetTuple (129);

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

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

相关文章

vue下载文件时显示进度条

1.单个下载&#xff08;开始是导出按钮 下载显示进度条&#xff09; html <el-button click.stop"exportReport(scope.row, scope.index)" v-if"!scope.row.schedule" icon"el-icon-download"size"small" type"text"styl…

cocos-lua资源管理

本文介绍cocos-lua项目的资源管理和工作流&#xff0c;适用人群包括初学者和有经验开发者&#xff0c;故读者可根据自己的需要有选择性的查阅自己需要的内容 一.简单案例解析 下文通过介绍一个简单demo&#xff0c;介绍合图和资源目录结构 1.1 运行效果 1.2 ccs结构 1.3 目录…

【Python-Spark(大规模数据)】

Python-Spark&#xff08;大规模数据&#xff09; ■ Spark■ PySparl编程模型■ 基础准备■ 数据输入■ RDD的map成员方法的使用■ RDD的flatMap成员方法的使用■ RDD的reduceByKey成员方法的使用■ 单词计数统计■ RDD的filter成员方法的使用■ RDD的distinct成员方法的使用■…

LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

环境不易满足&#xff0c;不建议复现

详解js中的console对象

对于前端开发而言&#xff0c;console对象大家肯定都很熟悉&#xff0c;最常用的 console.log() 是开发调试必用的 但是对于console对象的其他方法&#xff0c;相对而言使用的就比较少了。下面详细介绍一下&#xff1a; 谷歌浏览器输出console对象&#xff1a; 值得一提的是不…

JAVA MQTT 发布主题请求,订阅主题接收,订阅主题回复,发布主题再接收回复,三步走

先看效果 一、准备工作 1.官网下载emqx压缩包放到自己的盘符下&#xff0c;不要带中文路径 下载 EMQX 2.在路径的bin中&#xff0c;cmd&#xff0c;启动emqx服务 emqx start 3.访问服务&#xff0c;能打开就证明启动成功&#xff0c;登录的话官网默认的密码账号&#xff08;…

【C#】Stopwatch计时器

使用Stopwatch检查C#中代码块的执行时间&#xff0c;比如歌曲&#xff0c;图片的下载时间问题 首先&#xff0c;我们可看到Stopwatch 类内部的函数。 根据需求&#xff0c;我们具体可使用到 Start() 开始计时&#xff0c;Stop() 停止计时等 //创建 Stopwatch 实例 Stopwatch …

STM32单片机C语言模块化编程实战:LED控制详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 之前介绍了很多关于点灯的方法&#xff0c;比如…

ARM DMIPS算力说明

ARM DMIPS算力说明 ARM算力参考官网地址 https://en.wikipedia.org/wiki/List_of_ARM_processors Product familyARM architectureProcessorFeatureCache (I / D), MMUTypical MIPS MHzReferenceARM1ARMv1ARM1First implementationNoneARM2ARMv2ARM2ARMv2 added the MUL (mu…

【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解

文章目录 一、环境准备1.1、创建数据库和表1.2、导入框架依赖的jar包1.3、修改Maven的编译版本1.4、完善Maven目录1.5、编写项目需要的包1.6、编写实体、Mapper、Service 二、配置MyBatis环境2.1、配置mybatis的主配置文件2.2、编写映射文件2.3、测试环境是否正确 三、配置Spri…

el-table 三角形提示

<template><div><el-table :data"tableData" style"width: 100%"><el-table-column prop"ddd" label"日期2" width"150" /><el-table-column prop"ddd" label"日期2" width…

[C++][算法基础]分组背包问题(动态规划)

有 &#x1d441; 组物品和一个容量是 &#x1d449; 的背包。 每组物品有若干个&#xff0c;同一组内的物品最多只能选一个。 每件物品的体积是 &#xff0c;价值是 &#xff0c;其中 &#x1d456; 是组号&#xff0c;&#x1d457; 是组内编号。 求解将哪些物品装入背包&a…

AI大模型探索之路-训练篇1:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

一、路由基础

1.路由协议的优先级 路由器分别定义了外部优先级和内部优先级&#xff08;越小越优&#xff09; 路由选择顺序&#xff1a;外部优先级>>内部优先级&#xff08;相同时&#xff09; ①外部优先级&#xff1a;用户可以手工为各路由协议配置的优先级 ②内部优先级&#xf…

OmniPlan Pro for Mac v4.8.0中文激活版 项目流程管理工具

OmniPlan Pro for Mac是一款功能强大的项目管理软件&#xff0c;它以其直观的用户界面和丰富的功能&#xff0c;帮助用户轻松管理各种复杂的项目。 OmniPlan Pro for Mac v4.8.0中文激活版 通过OmniPlan Pro&#xff0c;用户可以轻松创建任务&#xff0c;设置任务的开始和结束时…

Pulsar【部署 02】Pulsar可视化工具Manager安装使用

Pulsar Manager 是一个基于 web 的 GUI 管理和监视工具&#xff0c;可帮助管理员和用户管理和监视租户、命名空间、主题、订阅、代理、集群等&#xff0c;并支持对多个环境进行动态配置。 可视化工具Manager安装使用 1.Docker1.1 拉取镜像并启动1.2 设置用户名密码1.3 登录并添…

openstack界面简单修改

openstack Ubuntu主题登录界面修改修改登陆界面背景登录框边缘添加透明效果修改登录界面logo更换站点图片更换项目logo图片 本实验基于VMware17&#xff0c;使用Ubuntu2310搭建openstack-B版 Ubuntu主题 以下配置只对Ubuntu主题生效 登录界面修改 原界面 关闭登录界面域名输…

LTD271次升级 | 网站/小程序可设访问IP的黑白名单 • 官微中心支持PDF等办公文件预览与并分享 • 订单退款显示更详尽明细

1、新增IP访问限制功能&#xff1b; 2、订单新增交易号显示与退款明细显示&#xff1b; 3、自定义地址增加四级地区&#xff1b; 4、Android版App优化文件功能&#xff1b; 5、已知问题修复与优化&#xff1b; 01 官微中心 1) 新增IP限制访问功能 允许或者禁止某些 IP 或…

信创需求激增,国产服务器操作系统赋能数字化转型

信创&#xff0c;即信息技术应用创新&#xff0c;是指在关键领域和环节推进信息技术的自主创新&#xff0c;构建安全可控的信息技术体系。随着数字化转型的加速&#xff0c;信创需求激增&#xff0c;国产服务器操作系统在其中扮演着至关重要的角色。国产服务器操作系统如何赋能…

WPF —— lCommand命令实例

首先在标签页面设置一个Button按钮 <Button Width"100" Height"40" Content"测试" ></Button> 1 创建一个类 继承于ICommand这个接口&#xff0c; 这个接口一般包含三部分&#xff1a; 俩个方法&#xff1a;一个判断指令是不是…