VTK基本数据结构之数据对象和数据集

来源:互联网 发布:淘宝纠纷率 编辑:程序博客网 时间:2024/06/05 07:46
针对可视化领域的特点,VTK定义了种类丰富的数据结构。我们必须了解基本数据结构。     

1、数据对象和数据集

  在VTK中,数据一般以数据对象(Data Object, 类vtkDataObject)的形式表现,这是VTK里可视化数据最常用的表达形式。数据对象是数据的集合,数据对象表现的数据是可以被可视化管线处理的数据,只有当数据对象被组织成一种结构后,才能被VTK提供的可视化算法所处理。VTK里所有的数据结构形式都是从vtkDataObject派生出来的。继承图如下所示。
  
这里写图片描述

  将数据对象组织成一种结构并且赋予相应的属性值,就形成了数据集(DataSet)。vtkDataSet由两个部分组成,即组织结构(Organizing Structure)以及与组织结构相关联的属性数据(Attribute Data)。详细构成如下图所示。
  
这里写图片描述

  vtkDataSet的组织结构由拓扑结构(Topology)和几何结构(Geometry)两部分组成。拓扑结构描述了对象的构成形式,几何结构描述了对象的空间位置关系。换言之,点数据所定义的一系列坐标点构成了vtkDataSet数据集的几何结构;点数据的连接形成了单元数据(Cell Data),由单元数据形成了数据集的拓扑结构。拓扑结构具有几何变换不变性。
属性数据是对拓扑结构和几何结构信息的补充,属性数据可以是某个空间点的温度值。

示例说明

CMakeLists.txt文件代码如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)PROJECT(VTKDataExample)FIND_PACKAGE(VTK REQUIRED)INCLUDE(${VTK_USE_FILE})ADD_EXECUTABLE(VTKDataExample    VTKDataExample.cpp)TARGET_LINK_LIBRARIES(VTKDataExample ${VTK_LIBRARIES})

VTKDataExample .cpp文件代码如下:

#include "vtkActor.h"#include "vtkCellArray.h"#include "vtkPoints.h"#include "vtkPolyData.h"#include "vtkPolyDataMapper.h"#include "vtkRenderWindow.h"#include "vtkRenderWindowInteractor.h"#include "vtkRenderer.h" #include "vtkProperty.h"#include "vtkLine.h"#include "vtkCellArray.h"#include "vtkPolyData.h"int main(){    //创建点数据    vtkSmartPointer<vtkPoints>points = vtkSmartPointer<vtkPoints>::New();    points->InsertNextPoint(1.0, 0.0, 0.0);    points->InsertNextPoint(0.0, 0.0, 1.0);    points->InsertNextPoint(0.0, 0.0, 0.0);    //每两个坐标点之间分别创建一条线    //SetId()的第一个参数是线段的端点ID,第二参数是连接的的点的ID    vtkSmartPointer<vtkLine>line0 = vtkSmartPointer<vtkLine>::New();    line0->GetPointIds()->SetId(0, 0);    line0->GetPointIds()->SetId(1, 1);    vtkSmartPointer<vtkLine>line1 = vtkSmartPointer<vtkLine>::New();    line1->GetPointIds()->SetId(0, 1);    line1->GetPointIds()->SetId(1, 2);    vtkSmartPointer<vtkLine>line2 = vtkSmartPointer<vtkLine>::New();    line2->GetPointIds()->SetId(0, 2);    line2->GetPointIds()->SetId(1, 0);    //创建单元数组,用于存储以上创建的线段    vtkSmartPointer<vtkCellArray>lines = vtkSmartPointer<vtkCellArray>::New();    lines->InsertNextCell(line0);    lines->InsertNextCell(line1);    lines->InsertNextCell(line2);    //将点和线加入数据集中,前者定义数据集的几何结构,后者定义拓扑结构    //创建vtkPolyData类型的数据,是一种数据集    vtkSmartPointer<vtkPolyData>polydata = vtkSmartPointer<vtkPolyData>::New();    //将创建的点数据加入vtkPolyData数据里    polydata->SetPoints(points);  //点数据定义了polydata数据集的几何结构。    polydata->SetLines(lines);  //定义拓扑结构    //显示数据    vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();    mapper->SetInputData(polydata);    vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();    actor->SetMapper(mapper);    actor->GetProperty()->SetColor(1.0, 0.0, 0.0);    vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();    ren->AddActor(actor);    ren->SetBackground(1, 1, 1);    vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();    renWin->AddRenderer(ren);    vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();    iren->SetRenderWindow(renWin);    renWin->SetSize(500, 500);    renWin->Render();    iren->Start();    return EXIT_SUCCESS;}

运行结果:
这里写图片描述

代码分析:

  • vtkPoints :用来描绘和操作 3D点排列(Array)。可以调用SetPoint或InsertPoint来设置点的vtkIdType(类似id的值)和三维坐标,2个函数的功能相同,区别在于InsertPoint先要完成点的范围检查和内存分配工作,所以速度较慢。
  • vtkCellArray:用来操作cell 单元。调用InsertNextCell函数逐步添加新的cell,例如函数vtkCellArray::InsertNextCell (vtkIdType npts, const vtkIdType pts ),第一个参数值表示cell中点的个数,第二个参数指向那些点的坐标数据。(说明:vtkIdType pts 存储的是所包括点在points中的顺序信息,其个数当然应该和前面的npts一致。),2点可以连成一条线,三点可以得到一个面。也就是说:vtk中关于点、线、面的那些信息都是存放在cellarray中,应用时也是直接对cellarray指针进行处理,数据的写入和读取在vtkCellArray类完成。
  • vtkPolyData: 一种数据集。

2、单元类型

   数据集由一个或多个单元组成。一系列有序的点按指定类型连接所定义的结构就是单元(Cell),是VTK可视化系统的基础。这些顺序连接的点定义了单元的拓扑结构,而点的坐标定义了单元的几何结构。单元是由单元的类型和构成单元的顶点列表两部分构成的。
  单元类型的线性与非线性的划分主要是以插值函数为依据的。对于线性单元,采用的是线性或者常量插值函数。VTK里单元类型定义在vtkCellType.h文件里。下图是定义线性和非线性的Cell类型。
这里写图片描述

这里写图片描述
注意定义点的顺序。

  线性的cells绘制时先转换为线性基元,再直接被图形库所处理。而非线性的cells是不能直接被图形库所支持的,通常对于非线性cells的绘制是先把它们分解为线性的cells,再进行绘制。非线性类型的cell有:Quadratic Edge; Quadratic Triangle; Quadratic Quadrilateral; Quadratic Tetrahedron; Quadratic Hexahedron
分解的示意图:
这里写图片描述

属性数据

  属性数据(Attribute Data)主要用于描述数据集的属性特征,对数据集的可视化实质上就是对属性数据的可视化。根据数据的性质,属性数据可分为标量数据、矢量数据、张量数据等几大类。如下图所示:
这里写图片描述

原创粉丝点击