VTK修炼之道12:基本数据结构_如何把几何结构&拓扑结构加入到数据集
来源:互联网 发布:jdk 7u51 windows x32 编辑:程序博客网 时间:2024/06/06 05:40
1. 无拓扑结构
只有几何结构,没有拓扑结构的vtkDataSet#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h>#include <vtkPointData.h>#include <vtkPolyData.h>#include <vtkPolyDataWriter.h>int main(){//创建几何数据,没有拓扑数据vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();points->InsertNextPoint(1.0,0.0,0.0);points->InsertNextPoint(0.0,0.0,0.0);points->InsertNextPoint(0.0,1.0,0.0);//把几何数据(拓扑数据为空)放入到某个数据集中vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);//将polydata类型的数据写到一个vtk文件中vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("PolyData.vtk");writer->SetInputData(polydata);writer->Write();return 0;}首先创建了一个点数据(vtkPoints),里面含有三个点;紧接着创建了一个类型为vtkPolyData的数据集,vtkPolyData派生自类vtkPointSet,而vtkPointSet又派生自vtkDataSet,所以说vtkPolyData是一种具体的数据集;然后将创建的点数据加入到数据集,于是点数据就定义了该数据集的几何;最后把vtkPolyData的数据用类vtkPolyDataWriter写入到PolyData.vtk文件。利用Notepad++打开文件,利用ParaView可视化如下:
2. 零维拓扑结构及实验
给数据集定义一维拓扑结构——顶点。#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h>#include <vtkPoints.h> //几何结构#include <vtkPolyData.h> //数据集#include <vtkPolyDataWriter.h>#include <vtkCellArray.h> //拓扑结构int main(){//创建点坐标int X[3] = {1.0,0.0,0.0};int Y[3] = {0.0,0.0,0.0};int Z[3] = {0.0,1.0,0.0};//创建点数据&创建使每一个点加入类似顶点类型的CellvtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkCellArray> vertics = vtkSmartPointer<vtkCellArray>::New();for (unsigned int i=0; i<3; i++){//定义用来存储点索引的中间变量,vtkIdType相当int long等类型vtkIdType pId[1];//把点坐标加入VTKPoints中,InserNextPoint()返回加入点的索引;//使用这个索引号创建定点类型CellpId[0] = points->InsertNextPoint(X[i],Y[i],Z[i]);//每个坐标点都需要创建一个顶点Cellvertics->InsertNextCell(1,pId);}//创建VTKPolyData对象vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();//将几何结构 & 拓扑结构加入到数据集中polydata->SetPoints(points);polydata->SetVerts(vertics);//写数据、vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("TopoGeometry.vtk");writer->SetInputData(polydata);writer->Write();return 0;}与实验一不同之处在于该程序实例化了一个vtkCellArray的对象,前文说“点数据(Point Data)定义数据集的几何结构,单元数据(Cell Data)定义数据集的拓扑结构”。所以,vtkCellArray类型的对象vertices就是用来指定数据集polydata的拓扑结构,而polydata的几何结构则是由points来定义的。
此处定义的数据集的拓扑结构是零维的点,即单元类型是Vertex(顶点)。利用Notepad++打开文件,利用ParaView可视化如下:
3. 一维拓扑结构及实验
在上例的基础上做一些更改,将零维的点拓扑结构改成一维的线拓扑结构。#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); #include <vtkSmartPointer.h>#include <vtkPoints.h>#include <vtkCellArray.h>#include <vtkPolyData.h>#include <vtkPolyDataWriter.h>#include <vtkLine.h> //构建两个端点的连线int main(){//创建三个点坐标vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();points->InsertNextPoint(1.0,0.0,0.0); // ID=0;points->InsertNextPoint(0.0,0.0,0.0); // ID=1;points->InsertNextPoint(0.0,1.0,0.0); // ID=2;//每两个点之间用直线连接//SetId(para1,para2);para1:出发端点的ID;para2:连接端点的IDvtkSmartPointer<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);//创建Cell,存储拓扑特征:线段vtkSmartPointer<vtkCellArray> LineCell = vtkSmartPointer<vtkCellArray>::New();LineCell->InsertNextCell(line0);LineCell->InsertNextCell(line1);LineCell->InsertNextCell(line2);//创建数据集,并转入拓扑结构和几何结构vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();polydata->SetPoints(points);polydata->SetLines(LineCell);//写数据vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();writer->SetFileName("DataStruct2D");writer->SetInputData(polydata);writer->Write();return 0;}利用Notepad++打开文件,利用ParaView可视化如下:
4. 总结
对于VTK的数据集而言,数据集的几何结构和拓扑结构是其必不可少的两个部分。实验一只定义了数据集的几何结构,没有定义该数据集的拓扑结构,所以该数据集不能直接显示;实验二和实验三除了定义数据集的几何结构(由points定义),还定义了相应的拓扑结构。其中实验二定义的是零维的点拓扑结构;实验三定义的是一维的线拓扑结构,它们都是保存在由类vtkCellArray所实例化的对象里,除了零维的点、一维的线等类型的单元以外,VTK还定义了其他类型的单元。
5. 参考资料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》4. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.
0 0
- VTK修炼之道12:基本数据结构_如何把几何结构&拓扑结构加入到数据集
- VTK修炼之道11:基本数据结构_数据对象&数据集
- VTK修炼之道1_初识VTK
- VTK基本数据结构之数据对象和数据集
- VTK修炼之道19:图像基本操作_图像像素值的访问与修改
- VTK修炼之道20:图像基本操作_图像类型转换
- VTK修炼之道21:图像基本操作_彩色图像生成灰度图像
- VTK修炼之道22:图像基本操作_彩色图像成分提取
- VTK修炼之道24:图像基本操作_单颜色通道图像合成彩色
- VTK修炼之道26:图像基本操作_三维图像切片提取
- VTK修炼之道47:图形基本操作进阶_法向量计算
- VTK修炼之道51:图形基本操作进阶_连通区域分析
- VTK修炼之道59:图形基本操作进阶_纹理映射
- VTK修炼之道13:数据读写_图像数据的读写
- VTK学习笔记:数据集之结构化点集
- VTK修炼之道14:图像处理_创建
- VTK修炼之道31:图像二值化_阈值法
- VTK修炼之道32:边缘检测_梯度算子
- 设计模式之14 - 命令模式Command
- Java虚拟机学习(3): 类加载机制
- 寒假的c语言进阶
- rst
- spring切面:注解:抛出异常增强
- VTK修炼之道12:基本数据结构_如何把几何结构&拓扑结构加入到数据集
- Java虚拟机学习(4):JDK可视化监控工具
- phpcms中的数组转码
- maven+springMVC+hibernate工程搭建(四简单base层实现及demo)
- 设计模式之15 - 解释器模式Interpreter
- python 函数参数传值还是传引用
- 4.电话拨号器的实现
- Linux下配置防火墙
- Reverse Integer