您的位置:首页 > 其它

VTK学习笔记:数据集和单元集合介绍

2014-04-24 23:58 477 查看
数据集和单元集合:

1.数据可视化的特点

对数据可视化是VTK的主要功能,可视化模型的主要任务是对各种被可视化的数据进行组织和管理,形成具有一定结构形态的数据,然后映射到图形系统进行可视化处理,数据在可视化管线中流动的时候,每经过一次处理,数据都会从一种形态转变成另外一种形态,在VTK中,数据可视化具有如下的特点:

1、离散性

VTK可视化的数据都是离散的数据,这些离散的数据都是从一个无限的空间进行采样而得到的,用有限的离散数据近似的表达一个无限的空间,如对于二次方程y=x2,分别计算xi(i=1,2,...n)n个点的y值,形成n个离散点(x1,y1,....xn,yn),然后把这些点用连续的线段连接起来,构成要绘制的方程,用有限的离散点表现连续的空间,常用插值、二次、三次曲面、样条函数等算法对离散点进行处理。

2、数据的结构是规则(结构化)的或是不规则(非结构化)的

构成结构化数据的离散点之间具有一定的层次关系,如格网数据结构就是结构化的数据,离散数据点之间具有很强的逻辑关系,非结构化数据的离散点之间没有逻辑关系,常用于表现性质差异变化比较大的数据,如不均匀物体的密度等信息。

3、数据具有一定的空间尺度

VTK可视化的数据具有一定的空间尺度,如点表现为0维,一维的线、二维的面和三维的体等,对于不同维度的数据,VTK提供了不同的可视化方法。

二、数据集介绍

要完成如此丰富的可视化,那么就需要一个管理部门去管理这些数据,这就是数据集的强大的地方。

在VTK可视化管线中的数据对象,称为数据集,数据集主要由组织结构和数据属性两部分组成,如下图所示:



组织结构主要有几何数据和数据之间的拓扑关系组成,拓普关系描述了数据之间的一种固定的构成关系,在VTK中,这种构成关系被称为单元,几何数据用空间位置坐标表示,描述了数据在空间的位置,也描述了数据拓扑空间关系,如TIN数据由多个三角形构成,三角形被称为单元,描述这些单元所在空间的数据点就是几何数据。属性数据主要描述几何数据或单元数据的相关属性信息,如在地质应用中,常用属性数据表示某一个空间位置点的地层。

在VTK应用中,数据集的构成是很重要的内容,只有了解了这些,才能更好的构建自己需要可视化的数据。即使你不需要构建自己的数据,从文件里面加载进来,也要了解你的数据的格式吧。

三. 单元集合

如果你想要构建自己的数据,了解单元集合很有必要。

VTK的数据集对象主要由多个单元构成,如对于如下的多边形网格,其由多个四边形单元构成。

图中的各个顶点(1、2、3...25)定义了网格图形的几何形状,构成了数据集的几何数据,各个顶点依照构建的单元类型,按一定顺序排列,相互连通,构成了单元的拓扑结构,如在上图中,构建的单元类型为四边形单元,则第一个单元由1、6、7、2四个顶点按1、6、7、2顺序排列,构成一个四边形单元。
下面再给出一个6面体类型单元的例子,如下图所示:



图中的6面体单元由7、21、22、5、8、10、1、6共8个顶点构成,共有6个面、12条边,顶点8和10构成了一条边,顶点8、10、21、22构成了一个面,顶点坐标存储在顶点列表数组中,如图中左侧的Point list用于存储顶点坐标。
在VTK中提供了许多单元类型,下面只选择几个简单的单元进行介绍。
1、顶点单元
基本的0维度单元,用单一的点来定义,如下图所示:



2、多顶点单元
基本的0维度单元,用多个点来定义,如下图所示:



3、线单元
基本的1维单元,由两个顶点定义,线的方向从第一个顶点指向第二个顶点,如下图所示:



说了这么久,知道了数据集是什么,自己手动如何构建数据集呢?

#include<vtkPoints.h>

#include<vtkSmartPointer.h>

#include<vtkCellArray.h>

#include<vtkPolyData.h>

#include<vtkPolyDataMapper.h>

#include<vtkRotationalExtrusionFilter.h>

#include<vtkActor.h>

#include<vtkProperty.h>

#include<vtkRenderer.h>

#include<vtkRenderWindow.h>

#include<vtkRenderWindowInteractor.h>

intmain()

{

//定义瓶子轮廓线的点坐标,这里是点,你也可

vtkSmartPointer<vtkPoints>pPoints=vtkPoints::New();

pPoints->InsertPoint(0,0.01,0.0,0.0);

pPoints->InsertPoint(1,1.5,0.0,0.0);

pPoints->InsertPoint(2,1.5,0.0,3.5);

pPoints->InsertPoint(3,1.25,0.0,3.75);

pPoints->InsertPoint(4,0.75,0.0,4.00);

pPoints->InsertPoint(5,0.6,0.0,4.35);

pPoints->InsertPoint(6,0.7,0.0,4.65);

pPoints->InsertPoint(7,1.0,0.0,4.75);

pPoints->InsertPoint(8,1.0,0.0,5.0);

pPoints->InsertPoint(9,0.2,0.0,5.0);

//构建线单元,绘制轮廓线

vtkSmartPointer<vtkCellArray>pLineCell=vtkCellArray::New();

//构建一个单元,由10个点构成

pLineCell->InsertNextCell(10);

//构成单元点集的索引号

pLineCell->InsertCellPoint(0);

pLineCell->InsertCellPoint(1);

pLineCell->InsertCellPoint(2);

pLineCell->InsertCellPoint(3);

pLineCell->InsertCellPoint(4);

pLineCell->InsertCellPoint(5);

pLineCell->InsertCellPoint(6);

pLineCell->InsertCellPoint(7);

pLineCell->InsertCellPoint(8);

pLineCell->InsertCellPoint(9);

//定义多边形数据集

vtkSmartPointer<vtkPolyData>pPolyData=vtkPolyData::New();

//设置构成多边形的几何数据

pPolyData->SetPoints(pPoints);

//设置单元类型,线单元

pPolyData->SetLines(pLineCell);

//压制轮廓线,形成瓶子实体

vtkSmartPointer<vtkRotationalExtrusionFilter>pExtruFilter=vtkRotationalExtrusionFilter::New();

pExtruFilter->SetInput(pPolyData);

//设置生成瓶子表面的光滑度参数,瓶子的表面由多少个面构成

pExtruFilter->SetResolution(10);

//将数据映射到图形系统进行绘制

vtkSmartPointer<vtkPolyDataMapper>pMap=vtkPolyDataMapper::New();

pMap->SetInput(pExtruFilter->GetOutput());

vtkSmartPointer<vtkActor>pActor=vtkActor::New();

pActor->SetMapper(pMap);

pActor->GetProperty()->SetColor(0.3800,0.7000,0.1600);

//绘制

vtkSmartPointer<vtkRenderer>pRen=vtkRenderer::New();

pRen->AddActor(pActor);

//创建绘制窗体

vtkSmartPointer<vtkRenderWindow>pRenWin=vtkRenderWindow::New();

pRenWin->AddRenderer(pRen);

//创建交互器

vtkSmartPointer<vtkRenderWindowInteractor>pIren=vtkRenderWindowInteractor::New();

pIren->SetRenderWindow(pRenWin);

//设置背景颜色

pRen->SetBackground(1,1,1);

//设置窗口尺寸

pRenWin->SetSize(300,300);

pRenWin->Render();

pRen->ResetCamera();

//开始绘制

pIren->Initialize();

pIren->Start();

return 0;

}

[b]记住一点:数据集包含2部分:组织结构(单元 + 描述这些单元所在空间的数据点的几何数据)+属性[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: