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)主要用于描述数据集的属性特征,对数据集的可视化实质上就是对属性数据的可视化。根据数据的性质,属性数据可分为标量数据、矢量数据、张量数据等几大类。如下图所示:
- VTK基本数据结构之数据对象和数据集
- VTK修炼之道11:基本数据结构_数据对象&数据集
- VTK基本数据结构之数据的存储和表达
- VTK修炼之道12:基本数据结构_如何把几何结构&拓扑结构加入到数据集
- VTK教程之五 数据集的类型和数据集…
- VTK数据集实例
- vtk中数据集
- VTK学习笔记:数据集之多边形数据集
- VTK学习-VTK基本数据结构
- 6、VTK基本数据结构
- VTK学习笔记:数据集之结构化点集
- VTK学习笔记:数据集和单元集合介绍
- redis基础数据结构和数据对象
- [VTK]VTK中的数据表示
- VTK学习(九)VTK基本数据结构
- 对象数据与基本数据
- VTK经验分享 4. VTK数据集实例
- PDF----基本数据对象
- java实现栈
- idea 部署非maven项目
- 在线云评测系统日志(三):登陆注册的实现
- Android的toolbox及busybox,toybox
- 三层架构和MVC的理解
- VTK基本数据结构之数据对象和数据集
- LeetCode 538. Convert BST to Greater Tree 解题报告
- Oracle11g 手动建库
- WCF不能传输超过10万条数据
- android 开机自动启动程序
- Linux中硬链接与软链接的区别与联系
- 面向对象编程的基本原则
- 2017.05.21练习赛赛后总结
- 一天一条shell命令--------退出状态