6、VTK基本数据结构
我们已经学习了VTK的一个重要概念——可视化管线,了解了VTK数据的流动过程。好比我们做一道菜,在做每一道菜之前,首先要掌握这道菜的做法,什么时候放盐什么时候放酱油等调料,除了需要弄清楚做每一道菜的流程,还需要了解所做的每一道菜的原料,比如有些原料是要蒸出来才比较好吃,有些则可能会用炖的方法才比较可口,只有掌握做菜的流程以及了解菜的原料的特点,最后做出来的菜才可口美味。如果说VTK可视化管线是完成VTK应用程序这道菜的基本步骤,那么VTK的数据结构就好比我们做每一道菜的基本原料。针对可视化领域的特点,VTK定义了种类丰富的数据结构,这一章我们重点学习VTK的基本数据结构,了解这些数据结构,有助于我们写出更有针对性的、更高效的可视化应用程序。
6.1 可视化数据的基本特点
我们的目的是要对数据进行可视化,因此有必要对可视化的数据特点作一了解。归纳起来,可视化数据具有如下一些特点:
l 离散性
为了让计算机能够获取、处理和分析数据,必须对无限、连续的空间体进行采样,生成有限的采样数据点,这些数据以离散点的形式存储,采样的过程是一个离散化的过程。
由于可视化数据的离散性特点,在某些离散点上有精确的值存在,但点与点之间的值则是不可知的,要得到采样点之外的其他点的值,只有通过插值(Interpolation)的方法获取。常用的插值方法是线性插值,要得到更精确的数值可以采用非线性插值,如B样条插值方法。
l 数据具有规则或不规则的结构(或者说结构化与非结构化)
可视化数据可以分为规则(Regular)和不规则(Irregular)或者说结构化(Structured)和非结构化(Unstructured)。规则结构数据点之间有固定的关联关系,可以通过这些关联确定每个点的坐标,不规则结构数据之间没有固定的关联关系。
对于规则结构的数据,存储时不必存储所有的数据点,只需存储起始点、相邻两点之间的间隔以及点的总数就可以保存完整的数据信息。对于不规则结构的数据,虽然不可以像规则结构的数据那样存储,但它也有自身的优势,即在数据变化频繁的区域可以密集表示,而数据变化不频繁的区域则稀疏表示。规则结构的数据可以在存储及计算时占优势,不规则结构的数据虽然存储和计算时不能像规则结构的那样高效,但它在数据表达方面相对而言则更加自由,更加细致、灵活的表现数据。
l 数据具有维度
可视化数据的第三个特点是拓扑维度(Topological Dimension)。可视化数据具有零维、一维、二维、三维等任意维度。如,零维的数据表现为点,一维数据表现为曲线,二维数据表现为曲面,三维数据表现为体等。数据的维度决定了数据可视化的方法,如,对于二维的数据,可以将数据存储到一个矩阵,然后再采用针对二维数据的可视化方法进行可视化(如等高图)。
6.2vtkDataObject和vtkDataSet
6.2.1 vtkDataObject
在VTK中,数据一般以数据对象(Data Object,对应VTK里的类vtkDataObject)的形式表现,是VTK里可视化数据最一般的表达形式。数据对象是数据的集合,数据对象表现的数据是可以被可视化管线处理的数据,只有数据对象被组织成一种结构(Structure)后,才能被VTK提供的可视化算法处理。
图6.1是vtkDataObject类的继承图,VTK里所有的数据结构形式都是从这个类派生出来的,实际的VTK应用程序中,没有直接使用vtkDataObject来实例化数据对象,而是根据具体的可视化数据选用其具体的子类实现可视化的。
图6.1vtkDataObject类的继承图
6.2.2 vtkDataSet
数据对象被组织成一种结构并且被赋予相应的属性值时就形成数据集(Dataset)。VTK里与数据集对应的类是vtkDataSet,该类从vtkDataObject直接派生。vtkDataSet由两个部分组成,即组织结构(Organizing Structure)以及与组织结构相关联的属性数据(Attribute Data),图6.2描述了vtkDataSet各结构的详细构成。vtkDataSet是一个抽象基类,结构的实现及表达由其具体的子类来完成。
vtkDataSet的组织结构由拓扑结构(Topology)和几何结构(Geometry)两部分组成。拓扑结构描述了物体的构成形式,几何结构描述了物体的空间位置关系。换言之,点数据(Point Data)所定义的一系列坐标点构成了vtkDataSet(数据集)的几何结构;点数据的连接(点的连接先形成单元数据(Cell Data),由单元数据再形成拓扑)就形成了数据集的拓扑结构。比如,我们想要在屏幕上显示一