赞
踩
可视化数据有以下特点:
在VTK中,数据一般以数据对象(类vtkDataObject)的形式表现。数据对象是数据的集合,数据对象表现的数据是可以被可视化管线处理的数据,只有当数据对象被组织成一种结构后,才能被VTK提供的可视化算法处理。
VTK里的所有数据结构形式都是从vtkDataObject派生出来,但在实际的应用中,没有直接使用vtkDataObject来实例化数据对象,而是根据具体的可视化数据选用具体的子类实现。
将数据对象组织成一种结构并且赋予相应的属性值,就形成了数据集(DataSet)。vtk里与数据集对应的类是vtkDataSet,该类从vtkDataObject直接派生。vtkDataSet由两部分组成:组织结构、属性数据。
组织结构又细分为拓扑结构和几何结构。拓扑结构描述了对象的构成形式,几何结构表述对象的空间位置关系。如点数据定义的一系列坐标点构成了数据集的几何结构;点之间的连接形成单元数据(Cell Data)则是拓扑结构。
属性数据是组织结构数据的补充,可以是空间某点的位移值,温度值等。
一系列有序的点按指定类型连接所定义的结构就是单元,数据集由一个或多个单元组成。VTK支持的线性和非线性单元如下图:
单元是由单元类型和构成单元的顶点两部分组成。单元类型决定了点集里点的顺序,点的个数是单元是大小Size。单元的线性与非线性的划分主要是以插值函数为依据。VTK里单元类型的定义在vtkCellType.h文件中。
非线性单元提供更加准确的插值函数,可获得更加理想的可视化效果。非线性单元需转换成线性单元才能进行渲染,VTK中是将非线性单元进行细分,将细分结果当初线性单元进行处理。
看个绘制三角形的例子:
#include <vtkSmartPointer.h> #include <vtkPolygon.h> #include <vtkTriangle.h> #include <vtkCellArray.h> #include <vtkPolyData.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkProperty.h> #include <vtkNew.h> #include <iostream> int main(int argc, char *argv[]) { // 几何点 vtkNew<vtkPoints> points; points->InsertNextPoint(0.0, 0.0, 0.0); points->InsertNextPoint(1.0, 0.0, 0.0); points->InsertNextPoint(1.0, 1.0, 0.0); // 多边形单元,有三个顶点 vtkNew<vtkPolygon> polygon; polygon->GetPointIds()->SetNumberOfIds(3); polygon->GetPointIds()->SetId(0, 0); polygon->GetPointIds()->SetId(1, 1); polygon->GetPointIds()->SetId(2, 2); // 数据集的单元Set vtkNew<vtkCellArray> cells; cells->InsertNextCell(polygon); // 建立多边形数据集,包括几何点与拓扑信息 vtkNew<vtkPolyData> polygonPolyData; polygonPolyData->SetPoints(points); polygonPolyData->SetLines(cells); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputData(polygonPolyData); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); renderer->SetBackground(0.5, 0.5, 0.5); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); renderWindow->SetSize( 640, 480 ); renderWindow->Render(); renderWindow->SetWindowName("PolyDataNew"); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetRenderWindow(renderWindow); renderWindow->Render(); renderWindowInteractor->Start(); return EXIT_SUCCESS; }
属性数据主要用于描述数据的属性特征,对数据集的可视化实质上是对属性数据的可视化。例如,根据压力检测数据构建一个压力场可视化数据集后,数据集中每个几何点或单元都必须有对应的属性数据,VTK根据属性数据设置颜色表,用不同的颜色表示不同的压力,通过颜色的变化情况,可直观看出压力的变化趋势。
在VTK中,用vtkPointData类和vtkCellData类表达数据集属性,他们是vtkDataSetAttributes的子类,构成数据集每个点或单元和属性之间的一对一关系。
属性数据的分类:
1. 标量数据:数据集每个位置具有单值的数据,它只表示数据的大小,例如温度、密度、压力、高度等
2. 矢量数据:既有大小也有方向的量,如速度、压力、位移等
3. 纹理坐标:用于物体贴图,使物体看起来更真实;
4. 张量数据:一个k阶张量可当做一个k维表格,0阶张量是标量,一阶张量是矢量,二阶张量是纹理坐标,三阶张量是一个三维阵列,VTK只支持3X3的对称张量
1. 图像数据vtkImageData
按规则排列在矩形方格中的点和单元集合。如果数据集的点和单元排列在平面上,则称为像素映射pixmap、位图或图像;如果排列在三维上,则称为体。
2. 多边形数据集vtkPloyData
多边形数据集vtkPolyData由顶点Vertex、多顶点Polyvertex、线Line、折线Ployline和三角形带Triangle Strip等单元构成,多边形数据是不规则结构的,并且多变形数据集的单元在拓扑维度上有多种类型。
3. 结构化网格vtkStructuredGrid
结构化网格数据,具有规则的拓扑结构和不规则的几何结构,但是单元没有重叠或交叉。结构化网格的单元由四边形或六面体组成,通常用于有限元分析
5. 非结构化网格vtkUnstructuredGrid
非结构化网格,是最常用的数据集类型,他的拓扑结构和几何结构都是非结构化的,在此数据集中,所有单元类型都可以组成任意组合,所有单元的拓扑结构从零维延伸至三维。
vtkDataArray:数据数组,采用连续内存,可以快速地创建、删除、遍历。vtkDataArray及其子类是建立VTK数据对象的基础。以vtkPloyData为例,该类由几何数据vtkPoints、拓扑数据vtkCellType和属性数据vtkPointData、vtkCellData、vtkFiledData)组成,而这些数据都是通过数据数组的形式存储。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。