数据集的属性(属性数据)是与数据集结构相关联的。而数据集又是建立在点和单元的基础上,所以数据属性很自然地是与点和单元相关联。即每个点或每个单元都有与其对应的数据属性。
数据属性的值称为属性数据。属性数据一般设置为一些有实际意义的值,如在某点处的温度(用一个数值表示),或在某点处所受的力(用三个数值表示)等。点或单元的属性数据是以数据数组(vtkDataArray)的形式进行存储的,根据数据值类型的不同,具体是存储 在vtkDataArray的子类中,如vtkFloatArray或vtkIntArray等。数组的每个元素称为元组,对应着但个点或单元的属性数据。每个元组可以有多个分量(Component),例如速度值就有分别沿着x,y,z轴的三个分量。数组的长度必须与点或单元的个数相同,这样才能保证与点或单元一一对应。
在插入各个数据前,元组的个数可以不指定。这样的话,就必须调用名字前缀为Insert的方法插入数据(注意最终插入的元组个数必须等于点或单元的个数)。如果制定了元组个数的话,就可以调用名字前缀为Set的方法,该方法相对较快些。方法名后缀的数字表示的是元组中分量的个数,该数字与SetNumberOfComponents()参数一致,默认分量个数为1.设定每个元组数据时,需提供若干个参数,第一个是点ID号,之后是元组各个分量的值。设置元组数据还有很多种方法可供选择。
首先需要调用数据集的方法GetPointData()或者GetCellData()获取点或单元数据,接着调用方法SetScalars()和SetVectors()将数据数组作为特殊属性数据存储。这两个方法分别设置的是标量属性数据和矢量属性数据(其他特殊属性数据还包括法向量属性数据、纹理坐标属性数据和张量属性数据,分别用方法SetNormals()、SetTCoords()和SetTensors()设置)。最后调用AddArray()将数据数组作为一般属性数据添加进数据集中。该方法可以多次调用从而添加多个数据数组。正是由于一般属性数据没有数量上的限制,所以使用字符串名字来进行区分会方便些。
在VTK中用vtkPointData类和vtkCellData类表达数据集属性,它们是类vtkFieldData的子类,构成数据集的每个点(或单元)和属性数据之间存在一对一的关系,如一个数据集由N个点(或单元)构成,那么必须有N个属性数据和这N个点(或单元)一一对应,通过点的ID号就可以对该点的属性数据进行访问,例如在数据集aDataSet中访问ID号为129的点的标量值时(假设标量数据已被定义且不为空)使用如下方法:
aDataSet->GetPointData()->GetScalars()->GetScalar(55)。
几何结构points和拓扑结构Cell数据。
点和拓扑结构的指定:
属性数据的指定:
先用5个空间中的点,用构建了一个长方形和一个三角形:
然后给这些点和cell加入颜色属性设置:
vtkFieldData
vtkFieldData用来存储数据的属性数据,该数据是对拓扑结构和几何结构信息的补充。属性数据可以是某个空间点的温度或某个单元的质量等。在vtk中与数据集的点数据相关联的属性数据用vtkPointData表达,与单元数据相关联的属性数据用vtkCellData表达。
vtkFieldData表示和操作数据的字段。字段的模型是一个m × n的数据值矩阵,其中m是元组的数量,n是组件的数量。(元组是矩阵中包含n个元素的一行。)该字段假定是由一个或多个数据数组组成的集合,其中数组中的数据是不同类型的(例如,int, double, char等),并且每个数组中可能有不同数量的组件。注意,假设每个数据数组的长度为“m”(即元组的数量),这通常对应于数据集中的点或单元格的数量。此外,每个数据数组必须有一个字符串名称。(用于操作数据。)
vtkDataSetAttributes是一个用于表示和操作属性数据(例如,标量、向量、法线、纹理坐标、张量、全局id、谱系id和字段数据)的类。这为vtkFieldData增加了从字段中选择一个数组作为每个属性类型的当前活动数组的能力。
此外,vtkDataSetAttributes提供了筛选调用的方法,这些调用通过字段传递数据、将数据复制到字段中以及从字段中插入数据。PassData将整个数组从源传递到目标。复制将元组的某个子集从源传递到目标。Interpolate使用提供的权重从源数据中选择的元组进行插值,以在目标数据中生成新的元组。每个属性类型都有传递、复制和插值“复制”标志,即可以在目标中设置,以选择将哪些属性数组从源传输到目标。
最后,该类提供了一种机制来确定一组源具有哪些共同属性,并将元组从源复制到目标,只针对所有源都拥有的那些属性。