06-VTK基本数据结构(3)

来源:互联网 发布:linux 多线程下载工具 编辑:程序博客网 时间:2024/06/06 05:11

6.4 属性数据

属性数据(AttributeData)是与数据集的组织结构相关联的信息。由前面的内容可知,组织结构包括几何结构及拓扑结构,几何结构由点数据定义,拓扑结构由单元数据定义。因此,属性数据通常是与数据集的点数据或者单元数据相关联,但有时属性数据也可能与组成单元的某些成分相关联,如,单元数据的某条边或者某个面等。此外也可以给整个数据集指定某个属性数据,或者数据集里的某一组单元数据或点数据指定相应的属性数据。

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

依据数据的性质属性数据可分为标量数据、矢量数据、张量数据等几大类(图6.10)。属性数据可以抽象为n维的数组,比如,像温度、压力等单值函数可以看作是1×1的数组,速度等矢量数据可以看作是3×1的数组(沿X、Y和Z三个方向的分量)。相对而言,属性数据中的标量数据和矢量数据应用比较广泛。

 

图6.10属性数据

在VTK中用vtkPointData类和vtkCellData类表达数据集属性,它们是类vtkDataSetAttributes(vtkDataSetAttributes派生自vtkFieldData)的子类,构成数据集的每个点(或单元)和属性数据之间存在一对一的关系,如一个数据集由N个点(或单元)构成,那么必须有N个属性数据和这N个点(或单元)一一对应,通过点的索引号就可以对该点的属性数据进行访问,例如在数据集aDataSet中访问索引号为129的点的标量值时(假设标量数据已被定义且不为空)使用如下方法:

aDataSet->GetPointData()->GetScalars()->GetScalar(129)。

标量数据(Scalar)

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

示例VTKConceptScalars演示了VTK里是如何给点数据或者单元数据指定标量属性数据的。从示例VTKConceptScalars可以看出,要给数据集里的点数据或者单元数据设置标量属性数据,只要先获取到该数据集对应的点数据或者单元数据,然后设置相应的标量属性数据即可,即:GetPointData()->SetScalars()。

 

示例VTKConceptScalars

   1: int main(int, char *[])

   2:  {

   3:   //创建点集数据:包含两个坐标点。

   4:   vtkSmartPointer<vtkPoints> points =vtkSmartPointer<vtkPoints>::New();

   5:   points->InsertNextPoint(0,0,0);

   6:   points->InsertNextPoint(1,0,0);

   7:  

   8:   //创建多边形数据。

   9:   vtkSmartPointer<vtkPolyData> polydata =vtkSmartPointer<vtkPolyData>::New();

  10:   polydata->SetPoints(points);

  11:  

  12:   //准备加入点数据的标量值,两个标量值分别为1和2。

  13:   vtkSmartPointer<vtkDoubleArray> weights =vtkSmartPointer<vtkDoubleArray>::New();

  14:   weights->SetNumberOfValues(2);

  15:   weights->SetValue(0, 1);

  16:   weights->SetValue(1, 2);

  17:   

  18:   //先获取多边形数据的点数据指针,然后设置该点数据的标量属性值。

  19:   polydata->GetPointData()->SetScalars(weights);

  20:  

  21:   //输出索引号为0的点的标量值。

  22:   double weight = vtkDoubleArray::SafeDownCast(

  23:                   polydata->GetPointData()->GetScalars())->GetValue(0);

  24:   std::cout << "double weight: " << weight <<std::endl;

  25:  

  26:   return 0;

  27:  }

矢量数据Vector

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

除了矢量数据用三元组表示,颜色等标量数据也会用类似三元组的结构表示。比如,从第3章“颜色”一节可知,颜色可以用RGB三个分量表示,RGB分量是构成颜色标量数据的三个组分(Component),尽管颜色vtkColor也是使用vtkVector容器,但它与矢量数据是有本质区别的。

标量数据之所以称之为标量数据,是它在数据集的几何变换过程的不变性。比如,假设有一个矢量数据存储在某个vtkDataSet数据集里,当使用vtkTransformFilter对该数据集作变换时,我们希望的结果是该矢量数据也随着数据集的变换而变换;而对于RGB系统的颜色,假如把该颜色的RGB三个分量当成矢量方向的三个方向,对该数据集作变换时,颜色值也会随着变化,对于某一点的颜色,显然我们需要的结果是变换前后它的值应该保持不变才对。

法向量Normal

法向量,是指大小恒为1的方向向量,通常用于计算投影、光照等。

纹理坐标Texture Coordinate

为了使物体看起来更加真实、逼真,计算机图形学通常采用纹理映射使得显示的三维物体具有更好的真实感。纹理坐标可以将点从笛卡尔坐标空间映射到一维、二维或三维的纹理空间中。

张量数据Tensor

张量是矢量和矩阵通过复杂的数学算法得到的,一个k阶的张量可当作一个k维的表格。零阶的张量是标量,一阶的张量是矢量,二阶的张量是纹理坐标,三阶的张量是一个三维阵列,VTK只支持3×3的对称的张量,如图6.10所示。


==========欢迎转载,转载时请保留该声明信息==========

版权归@东灵工作室所有,更多信息请访问东灵工作室


教程系列导航:http://blog.csdn.net/www_doling_net/article/details/8763686

================================================


原创粉丝点击