赞
踩
针对可视化领域的特点,VTK定义了种类丰富的数据结构。我们必须了解基本数据结构。
在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;
}
运行结果:
代码分析:
数据集由一个或多个单元组成。一系列有序的点按指定类型连接所定义的结构就是单元(Cell),是VTK可视化系统的基础。这些顺序连接的点定义了单元的拓扑结构,而点的坐标定义了单元的几何结构。单元是由单元的类型和构成单元的顶点列表两部分构成的。
单元类型的线性与非线性的划分主要是以插值函数为依据的。对于线性单元,采用的是线性或者常量插值函数。VTK里单元类型定义在vtkCellType.h文件里。下图是定义线性和非线性的Cell类型。
注意定义点的顺序。
线性的cells绘制时先转换为线性基元,再直接被图形库所处理。而非线性的cells是不能直接被图形库所支持的,通常对于非线性cells的绘制是先把它们分解为线性的cells,再进行绘制。非线性类型的cell有:Quadratic Edge; Quadratic Triangle; Quadratic Quadrilateral; Quadratic Tetrahedron; Quadratic Hexahedron
分解的示意图:
属性数据(Attribute Data)主要用于描述数据集的属性特征,对数据集的可视化实质上就是对属性数据的可视化。根据数据的性质,属性数据可分为标量数据、矢量数据、张量数据等几大类。如下图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。