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
原创粉丝点击