VTK Python 代码详解(四)

本文知识点整理自 《06-VTK基本数据结构(2)》

基本概念

单元 Cell 是可视化的基础,单元是一系列有序的点按指定类型连接所定义的结构。这些点的连接顺序通常被称为顶点列表(Connectivity List);所指定的类型定义了单元的拓扑结构;点的坐标定义了单元的几何结构。

六面体单元
如图是类型为六面体的单元。

顶点列表由点的索引号表示,即 8-10-1-6-21-22-5-7,每个点通过索引号可在顶点列表中检索到该点的实际坐标值。顶点列表定义了六面体单元的拓扑结构。

单元是由单元的类型(如六面体)和构成单元的顶点列表两部分构成的。

单元就是一个有序的点集 C i C_i Ci ={ p 1 , p 2 , . . . , p 3 p_1,p_2,...,p_3 p1,p2,...,p3}。单元的类型决定了点集里点的顺序,或者说单元的拓扑;而定义单元的点的个数就是该单元的大小 Size。

单元的拓扑维度除了三维之外,还可以是零维、一维、二维等。如零维的顶点 Vertex,一维的线 Line,二维的三角形 Triangle。

单元可以是基本类型或者基本类型的组合,基本类型是指不可再分的单元,组合类型是由基本类型组合而成。

VTK 单元类型分为线性和非线性和其他类型。单元类型的线性和非线性划分主要是以插值函数为依据。

线性单元

线性单元采用的是线性或者常量插值函数。单元里的任意一条辨都是由两个点连接定义的,线性单元类型有:

只列几个,其余详情可参考教程以及定义文件

Vertex:VTK_VERTEX,顶点,由一个点定义,是零维的基本类型。

Polyvertex:VTK_POLY_VERTEX,多顶点,多个顶点组合而成,是零维的组合单元,其定义不受顶点顺序的限制。

Line:VTK_LINE,直线,一维的基本类型,由两个点定义,方向是从第一个点指向第二个点。

Polyline:VTK_POLY_LINE,折线,由一条或多条直线组合而成,属于一维的类型。由n+1个有序的点连接定义的,n表示折线的线段条数,每两个点(i, i+1)定义一条线段。

Triangle:VTK_TRIANGLE,三角形,二维的基本类型,由三个点按逆时针的方向连接定义的,点的连接方向和表面法向量符合右手法则,即除大拇指外的手指沿着点的方向弯曲,大拇指所指向的方向就是表面法向量。

非线性单元

数值分析领域里为了更准确、精确地表达数据,采用非线性单元作为数据的基本表达结构。线性单元可以很容易转换成线图元被图形库处理,非线性单元不被图形库直接支持,因此非线性单元必须先转换成线性单元后才能被图形库支持。

VTK除了提供一套复杂的非线性单元接口框架,另一种做法就是在非线性单元的每一条曲线增加一个关键点,或者增加一个曲面来近似模拟非线性单元。

属性数据

属性数据(AttributeData)是与数据集的组织结构相关联的信息。属性数据主要用于描述数据集的属性特征,对数据集的可视化实质上是对属性数据的可视化,例如,根据压力监测数据构建一个压力场可视化数据集后,数据集中的每个数据点(几何数据)或单元都必须有对应的属性数据,VTK根据属性数据设置颜色表,用不同的颜色表示不同的压力,通过颜色的变化情况,可以直观的分析出压力的变化趋势。

标量数据是数据集里的每个位置具有单值的数据,它只表示数据的大小,例如温度、压力、密度、高度等。标量数据是最简单也是最普遍的可视化数据。

属性代码:

import vtk


points = vtk.vtkPoints()
points.InsertNextPoint(0,0,0)
points.InsertNextPoint(1,0,0)

polydata = vtk.vtkPolyData()
polydata.SetPoints(points)

weights = vtk.vtkDoubleArray()
weights.SetNumberOfValues(2)
weights.SetValue(0,1)
weights.SetValue(1,2)

polydata.GetPointData().SetScalars(weights)

weight = polydata.GetPointData().GetScalars().GetValue(0)

print(weight)

与物理上的矢量概念一样,VTK的矢量数据也是指既有大小也有方向的量,三维方向上用三元组(Triple)表示为(u, v, w),如速度、应力、位移等。

数据集

数据集由组织结构和与之关联的属性数据构组成,组织结构包括拓扑结构和几何结构。数据集的类型是由它的组织结构决定,同时数据集的类型决定了点和单元之间的相互关系。

依据数据集的结构特征,可分为规则结构和不规则结构的数据。如果组成数据集的点是规则的,则称该数据集的几何是规则的,如果组成数据集的单元之间的拓扑是规则的,则称该数据集的拓扑是规则的。

数据集图

vtkImageData

vtkImageData 类型的数据是按规则排列在矩形方格中的点和单元的集合,如图(a)所示,如果数据集的点和单元排列在平面(二维)上,称此数据集为像素映射(Pixmap)、位图或图像,由 vtkPixel 单元组成;如果排列在层叠面(三维)上,则称为体 (Volume),由 vtkVoxel 单元组成。

vtkImageData 是由一维的线、二维的像素或三维的体素组成,vtkImageData 在几何结构及拓扑结构都是规则的,因此每个点的位置可隐式地表达,只需要知道 vtkImageData 数据的维数、起始点的位置和相邻点之间的间隔,就可以计算出每个点的空间位置。数据维数用一个三元组 (nx, ny, nz) 来表示,分别表示在 X、Y 和 Z 方向上点的个数。

vtkImageData is a data object that is a concrete implementation of vtkDataSet. vtkImageData represents a geometric structure that is a topological and geometrical regular array of points. Examples include volumes (voxel data) and pixmaps.

vtkPolyData

多边形数据集 vtkPolyData 由顶点 (Vertex)、多顶点 (Polyvertex)、线 (Line)、折线 (Polyline) 和三角条带 (Triangle Strip) 等单元构成,多边形数据是不规则结构的,并且多边形数据集的单元在拓扑维度上有多种类型,如图(e)所示。多边形数据是数据、算法和高速计算机图像学的桥梁。

vtkRectilinearGrid

vtkRectilinearGrid 类型(线性网格)的数据是排列在矩形方格中的点和单元的集合,如图(b)所示,线性网格的拓扑结构是规则的,但其几何结构只是部分规则,也就是说,它的点是沿着坐标轴排列的,但是两点间的间隔可能不同,与 vtkImageData 类型的数据相似,线性网格是由像素或体素等单元组成的,它的拓扑结构通过指定网格的维数来隐式表达,几何结构则通过一系列的 x, y, z 坐标来表达。

vtkStructuredGrid

vtkStructuredGrid 是结构化网格数据,具有规则的拓扑结构和不规则的几何结构,但是单元之间没有重叠或交叉,如图(c)所示。结构化网格的单元是由四边形或六面体组成,结构化网格通常用于有限差分分析。典型的应用包括流体流动、热量传输和燃烧学等。

vtkUnstructuredGrid

vtkUnstructuredGrid,非结构化网格是最常见的数据集类型,它的拓扑结构和几何结构都是不规则的,在此数据集中所有单元类型都可以组成任意组合,所以单元的拓扑结构从零维延伸至三维,如图(f)所示。

VTK中任一类型的数据集都可用非结构化网格来表达,vtkUnstructuredGrid 类型数据的存储需要大量的空间以及计算时需要消耗大量的资源,除非迫不得已,一般较少使用此种类型的数据集。非结构化网格主要用于有限元分析、计算几何和几何建模等领域。

vtkUnstructuredPoints

vtkUnstructuredPoints,非结构化点集,是指不规则地分布在空间的点集。非结构化点集具有不规则的几何结构,不具有拓扑结构,非结构化点集用离散点来表达,如图(d)所示。

通常,这类数据没有固定的结构,由一些可视化程序识别和创建的,非结构化点集适合表现非结构化数据,为了实现数据的可视化,可将这种数据形式转换成其它一些结构化的数据形式

常见数据集的类继承图

常见数据集类继承图

数据集的存储和表达

可视化数据自身的特点决定了数据对象内存的分配与管理必须谨慎处理才有可能创建出高效的可视化系统。VTK中对绝大多数的数据对象的内存分配采用连续内存,连续内存的结构可被快速地创建、删除和遍历,称为Data Array (数据数组),用类 vtkDataArray 实现。

vtkDataArray

数据数组的访问是基于索引的,从零开始计数。

Tuple(元组)的概念

许多可视化数据是由多个数据分量组成的,如RGB颜色数据由红、绿、蓝三个分量组成,为了在连续数组中表达这一类数据,VTK引入了元组(Tuple)的概念。元组是数据数组的子数组,用于存储数据类型相同的分量数据,元组的大小在给定后不会改变。

vtkDataArray 存储的是数值数据,如属性数据 (Attribute Data) 和点数据 (Point) 等。有些属性数据,如点、矢量、法向量和张量等,在定义时就需要指定元组的大小。例如,点、矢量和法向量等属性数据,元组的大小是3,而张量属性数据的元组大小是9 (即3×3的矩阵),标量属性数据对于元组的大小则没有任何要求,对于处理标量属性数据的算法,通常都是只处理标量每一个元组数据的第一个分量。VTK提供了将多分量的数据数组分离成单一分量的数据数组,以及将单一分量的数据数组合并成多分量的数据数组的类,即 vtkSplitField 和 vtkMergeFields。

抽象/具体数据数组对象

可视化数据有各种各样的类型,如简单的浮点型、整型、字节型和双精度型等,再复杂一点的类型,如特征字符串和多维标识符等。既然有这么多种数据类型,那么数据数组是如何操作和表达这些数据的呢?VTK 通过对数据对象的抽象 (AbstractData Object) 提供运行时解决方案以及使用C++编译时动态绑定的方法(模板类)来解决这个问题的。

数据对象和数据集的表达

vtkDataArray 及其子类是建立VTK数据对象 (DataObject) 的基础。以 vtkPolyData 为例,该类含有存储几何结构的数据数组 (在vtkPoints类内),拓扑结构 (存储在vtkCellArray内) 和属性数据 (vtkField,vtkPointData 和vtkCellData类内)等同样有数据数组。vtkDataObject是一种通用的可视化数据的表达形式,内部封装了与可视化管线的执行相关的变量和方法,在vtkDataObject内部有一个vtkFieldData(场数据)的实例,负责对数据的表达。

数据集与数据数组之间的关系

数据集 DataSet 与数据数组 DataArray 之间的关系,在《TheVTK User’s Guide – 11th Edition 》这本书的第16章第1段有如下的内容:“In this section we provide detailed information describing the interface to the many data objects in VTK. This ranges from datasets, which are processed by the filter objects in visualization pipelines, to data arrays, which are used to represent a portion of a dataset (e.g., the scalar data).”

从上面这段话我们大概能够搞清楚 Dataset (数据集)与 DataArray (数据数组)这两个概念的区别。简单地理解为,数据集是 VTK 可视化管线所处理的对象;而数据数组是用于表达数值数据的内存组织形式,比如用数据数组来表示数据集里的标量数据。后续章节将会以程序示例的形式来加深对这些概念的理解。

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值