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还定义了其他类型的单元。