VTK 实例16:手动创建vtkPolyData数据集

发布时间 2023-08-14 15:15:58作者: 一杯清酒邀明月

 

 1 // This example shows how to manually create vtkPolyData.
 2 #include "vtkAutoInit.h" 
 3 VTK_MODULE_INIT(vtkRenderingOpenGL2);
 4 VTK_MODULE_INIT(vtkInteractionStyle);
 5 
 6 #include "vtkActor.h"
 7 #include "vtkCamera.h"
 8 #include "vtkCellArray.h"   //基元数组类
 9 #include "vtkFloatArray.h"  //浮点型数组类
10 #include "vtkPointData.h"
11 #include "vtkPoints.h"
12 #include "vtkPolyData.h"    //多边形数据类型类
13 #include "vtkPolyDataMapper.h"
14 #include "vtkRenderWindow.h"
15 #include "vtkRenderWindowInteractor.h"
16 #include "vtkRenderer.h"
17 
18 int main()
19 {
20   int i;
21   //立方体的八个顶点(每个顶点坐标由三个点组成)
22   static float x[8][3]={{0,0,0}, {1,0,0}, {1,1,0}, {0,1,0},
23                         {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1}};
24   //立方体的六个面(每个面由四个点的标号组成)
25   static vtkIdType pts[6][4]={{0,1,2,3}, {4,5,6,7}, {0,1,5,4},
26                         {1,2,6,5}, {2,3,7,6}, {3,0,4,7}};
27   
28   // We'll create the building blocks of polydata including data attributes.
29   //实例化一个多边形数据对象cube
30   vtkPolyData *cube = vtkPolyData::New();
31   //实例化一个点对象points
32   vtkPoints *points = vtkPoints::New();
33   //单元对象
34   vtkCellArray *polys = vtkCellArray::New(); 
35   //浮点数组对象
36   vtkFloatArray *scalars = vtkFloatArray::New();
37 
38   // Load the point, cell, and data attributes.
39   for (i=0; i<8; i++) points->InsertPoint(i,x[i]);//加载立方体的8个顶点
40   for (i=0; i<6; i++) polys->InsertNextCell(4,pts[i]);//加载每个面由4个点组成的六个面
41   for (i=0; i<8; i++) scalars->InsertTuple1(i,i);//绑定标量数据
42 
43   // We now assign the pieces to the vtkPolyData.
44   //与vtkPolyData型数据对象进行关联
45   cube->SetPoints(points);//进行点关联
46   points->Delete();
47   cube->SetPolys(polys);//进行面关联
48   polys->Delete();
49   cube->GetPointData()->SetScalars(scalars);//进行元组绑定
50   scalars->Delete();
51 
52   // Now we'll look at it.
53   //多边形数据送入图像界面进行绘制
54 
55   vtkPolyDataMapper *cubeMapper = vtkPolyDataMapper::New();
56       cubeMapper->SetInputData(cube);//vtkPolyData数据输出给映射器输入
57       cubeMapper->SetScalarRange(0,7);//设置标量数据范围0~7
58 
59   //实例化一个演员cubeActor
60   vtkActor *cubeActor = vtkActor::New();
61       cubeActor->SetMapper(cubeMapper);
62 
63   vtkCamera* camera = vtkCamera::New();
64       camera->SetPosition(1, 1, 1);//设置相机位置为(1,1,1)
65       camera->SetFocalPoint(0, 0, 0);
66 
67   vtkRenderer* renderer = vtkRenderer::New();
68       renderer->AddActor(cubeActor);
69       renderer->SetActiveCamera(camera);
70       renderer->ResetCamera();
71       renderer->SetBackground(1, 1, 1);
72      
73   vtkRenderWindow *renWin = vtkRenderWindow::New();
74       renWin->AddRenderer(renderer);
75       renWin->SetSize(300, 300);
76 
77   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
78       iren->SetRenderWindow(renWin);
79 
80   // interact with data
81   renWin->Render();//绘制舞台上的东西
82   iren->Start();//开始交互
83 
84   // Clean up
85   cube->Delete();
86   cubeMapper->Delete();
87   cubeActor->Delete();
88   camera->Delete();
89   renderer->Delete();
90   renWin->Delete();
91   iren->Delete();
92 
93   return 0;
94 }