VTK 实例17:手动创建vtkImageData数据集

发布时间 2023-08-14 15:15:58作者: 一杯清酒邀明月
 1 #include "vtkAutoInit.h" 
 2 VTK_MODULE_INIT(vtkRenderingOpenGL2);
 3 VTK_MODULE_INIT(vtkInteractionStyle);
 4 
 5 #include "vtkRenderer.h"
 6 #include "vtkRenderWindow.h"
 7 #include "vtkRenderWindowInteractor.h"
 8 #include "vtkImageData.h"
 9 #include "vtkFloatArray.h"
10 #include "vtkContourFilter.h"
11 #include "vtkPolyDataMapper.h"
12 #include "vtkActor.h"
13 #include "vtkPointData.h"
14 
15 int main ()
16 {
17   int i, j, k, kOffset, jOffset, offset;
18   float x, y, z, s, sp;
19   
20   vtkRenderer *renderer = vtkRenderer::New();
21   vtkRenderWindow *renWin = vtkRenderWindow::New();
22     renWin->AddRenderer(renderer);
23   vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
24     iren->SetRenderWindow(renWin);
25 
26 //实例化一个vtkImageData数据对象vol
27   vtkImageData *vol = vtkImageData::New();
28       vol->SetDimensions(26,26,26);//设置各个方向坐标轴的大小
29       vol->SetOrigin(-0.5,-0.5,-0.5);//定义原点
30       sp = 1.0/25.0;
31       vol->SetSpacing(sp, sp, sp);
32 
33 //绑定一个属性数据
34   vtkFloatArray *scalars = vtkFloatArray::New();
35   for (k=0; k<26; k++)
36     {
37     z = -0.5 + k*sp;
38     kOffset = k * 26 * 26;
39     for (j=0; j<26; j++) 
40       {
41       y = -0.5 + j*sp;
42       jOffset = j * 26;
43       for (i=0; i<26; i++) 
44         {
45         x = -0.5 + i*sp;
46         s = x*x + y*y + z*z - (0.4*0.4);
47         offset = i + jOffset + kOffset;
48         scalars->InsertTuple1(offset,s);
49         }
50       }
51     }
52   vol->GetPointData()->SetScalars(scalars);
53   scalars->Delete();
54   //求取等式面、等高线等
55   //vtkSmartPointer<vtkContourFilter> contour = vtkSmartPointer<vtkContourFilter>::New();
56   vtkContourFilter *contour = vtkContourFilter::New();
57   contour->SetInputData(vol);
58   contour->SetValue(0,0.0);//设置等值
59   contour->Update();
60 
61   vtkPolyDataMapper *volMapper = vtkPolyDataMapper::New();
62       volMapper->SetInputData(contour->GetOutput());
63       volMapper->ScalarVisibilityOff();
64   vtkActor *volActor = vtkActor::New();
65       volActor->SetMapper(volMapper);
66 
67   renderer->AddActor(volActor);
68       renderer->SetBackground(1,1,1);
69   renWin->SetSize(450,450);
70 
71   // interact with data
72   renWin->Render();
73   iren->Start();
74 
75   // Clean up
76   renderer->Delete();
77   renWin->Delete();
78   iren->Delete();
79   vol->Delete();
80   scalars->Delete();
81   contour->Delete();
82   volMapper->Delete();
83   volActor->Delete();
84 
85   return 0;
86 }