VTK 基本数据结构_如何把几何结构&拓扑结构加入到数据集

1. 无拓扑结构

只有几何结构,没有拓扑结构的vtkDataSet

 1 #include <vtkAutoInit.h>  
 2 VTK_MODULE_INIT(vtkRenderingOpenGL); 
 3  
 4 #include <vtkSmartPointer.h>
 5 #include <vtkPointData.h>
 6 #include <vtkPolyData.h>
 7 #include <vtkPolyDataWriter.h>
 8  
 9 int main()
10 {
11     //创建几何数据,没有拓扑数据
12     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
13     points->InsertNextPoint(1.0,0.0,0.0);
14     points->InsertNextPoint(0.0,0.0,0.0);
15     points->InsertNextPoint(0.0,1.0,0.0);
16  
17     //把几何数据(拓扑数据为空)放入到某个数据集中
18     vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
19     polydata->SetPoints(points);
20  
21     //将polydata类型的数据写到一个vtk文件中
22     vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
23     writer->SetFileName("PolyData.vtk");
24     writer->SetInputData(polydata);
25     writer->Write();
26  
27     return 0;
28 }
首先 创建了一个点数据(vtkPoints),里面含有三个点;紧接着 创建了一个类型为vtkPolyData的数据集,vtkPolyData派生自类vtkPointSet,而vtkPointSet又派生自vtkDataSet,所以说vtkPolyData是一种具体的数据集; 然后将创建的点数据加入到数据集,于是点数据就定义了该数据集的几何;最后把vtkPolyData的数据用类vtkPolyDataWriter写入到PolyData.vtk文件。
利用Notepad++打开文件,利用ParaView可视化如下:
     

2. 零维拓扑结构及实验

给数据集定义一维拓扑结构——顶点。
 1 #include <vtkAutoInit.h>  
 2 VTK_MODULE_INIT(vtkRenderingOpenGL); 
 3  
 4 #include <vtkSmartPointer.h>
 5 #include <vtkPoints.h>    //几何结构
 6 #include <vtkPolyData.h>  //数据集
 7 #include <vtkPolyDataWriter.h>
 8 #include <vtkCellArray.h> //拓扑结构
 9  
10 int main()
11 {
12     //创建点坐标
13     int X[3] = {1.0,0.0,0.0};
14     int Y[3] = {0.0,0.0,0.0};
15     int Z[3] = {0.0,1.0,0.0};
16  
17     //创建点数据&创建使每一个点加入类似顶点类型的Cell
18     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
19     vtkSmartPointer<vtkCellArray> vertics = vtkSmartPointer<vtkCellArray>::New();
20     for (unsigned int i=0; i<3; i++)
21     {
22         //定义用来存储点索引的中间变量,vtkIdType相当int long等类型
23         vtkIdType pId[1];
24         //把点坐标加入VTKPoints中,InserNextPoint()返回加入点的索引;
25         //使用这个索引号创建定点类型Cell
26         pId[0] = points->InsertNextPoint(X[i],Y[i],Z[i]);
27         
28         //每个坐标点都需要创建一个顶点Cell
29         vertics->InsertNextCell(1,pId);
30     }
31     //创建VTKPolyData对象
32     vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
33     //将几何结构 & 拓扑结构加入到数据集中
34     polydata->SetPoints(points);
35     polydata->SetVerts(vertics);
36     //写数据、
37     vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
38     writer->SetFileName("TopoGeometry.vtk");
39     writer->SetInputData(polydata);
40     writer->Write();
41  
42     return 0;
43 }

与实验一不同之处在于该程序实例化了一个vtkCellArray的对象,前文说“点数据(Point Data)定义数据集的几何结构,单元数据(Cell Data)定义数据集的拓扑结构”。所以,vtkCellArray类型的对象vertices就是用来指定数据集polydata的拓扑结构,而polydata的几何结构则是由points来定义的。
此处定义的数据集的拓扑结构是零维的点,即单元类型是Vertex(顶点)。

利用Notepad++打开文件,利用ParaView可视化如下:

     

3. 一维拓扑结构及实验

在上例的基础上做一些更改,将零维的点拓扑结构改成一维的线拓扑结构。

 1 #include <vtkAutoInit.h>  
 2 VTK_MODULE_INIT(vtkRenderingOpenGL); 
 3  
 4 #include <vtkSmartPointer.h>
 5 #include <vtkPoints.h>
 6 #include <vtkCellArray.h>
 7 #include <vtkPolyData.h>
 8 #include <vtkPolyDataWriter.h>
 9 #include <vtkLine.h> //构建两个端点的连线
10 int main()
11 {
12     //创建三个点坐标
13     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
14     points->InsertNextPoint(1.0,0.0,0.0); // ID=0;
15     points->InsertNextPoint(0.0,0.0,0.0); // ID=1;
16     points->InsertNextPoint(0.0,1.0,0.0); // ID=2;
17     //每两个点之间用直线连接
18     //SetId(para1,para2);para1:出发端点的ID;para2:连接端点的ID
19     vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
20     line0->GetPointIds()->SetId(0,0);
21     line0->GetPointIds()->SetId(1,1);
22  
23     vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
24     line1->GetPointIds()->SetId(0,1);
25     line1->GetPointIds()->SetId(1,2);
26  
27     vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
28     line2->GetPointIds()->SetId(0,2);
29     line2->GetPointIds()->SetId(1,0);
30     //创建Cell,存储拓扑特征:线段
31     vtkSmartPointer<vtkCellArray> LineCell = vtkSmartPointer<vtkCellArray>::New();
32     LineCell->InsertNextCell(line0);
33     LineCell->InsertNextCell(line1);
34     LineCell->InsertNextCell(line2);
35     
36     //创建数据集,并转入拓扑结构和几何结构
37     vtkSmartPointer<vtkPolyData> polydata = vtkSmartPointer<vtkPolyData>::New();
38     polydata->SetPoints(points);
39     polydata->SetLines(LineCell);
40  
41     //写数据
42     vtkSmartPointer<vtkPolyDataWriter> writer = vtkSmartPointer<vtkPolyDataWriter>::New();
43     writer->SetFileName("DataStruct2D");
44     writer->SetInputData(polydata);
45     writer->Write();
46  
47     return 0;
48 }

利用Notepad++打开文件,利用ParaView可视化如下:

    

4. 总结

对于VTK的数据集而言,数据集的几何结构和拓扑结构是其必不可少的两个部分。实验一只定义了数据集的几何结构,没有定义该数据集的拓扑结构,所以该数据集不能直接显示;实验二和实验三除了定义数据集的几何结构(由points定义),还定义了相应的拓扑结构。其中实验二定义的是零维的点拓扑结构;实验三定义的是一维的线拓扑结构,它们都是保存在由类vtkCellArray所实例化的对象里,除了零维的点、一维的线等类型的单元以外,VTK还定义了其他类型的单元。
原文地址:https://www.cnblogs.com/ybqjymy/p/14241031.html