VTK生成等值线并标记值

  1 #include <vtkActor.h>
  2 #include <vtkDataSetMapper.h>
  3 #include <vtkNamedColors.h>
  4 #include <vtkNew.h>
  5 #include <vtkPoints.h>
  6 #include <vtkRenderWindow.h>
  7 #include <vtkRenderWindowInteractor.h>
  8 #include <vtkRenderer.h>
  9 #include <vtkSmartPointer.h>
 10 #include <vtkAppendFilter.h>
 11 #include <vtkProperty.h>
 12 #include <vtkUnstructuredGrid.h>
 13 #include <vtkCellDataToPointData.h>
 14 #include <vtkFloatArray.h>
 15 #include <vtkCellData.h>
 16 #include <vtkContourFilter.h>
 17 #include <vtkAutoInit.h>
 18 #include <vtkStripper.h>
 19 #include <vtkCellArrayIterator.h>
 20 #include <cstdlib>
 21 #include <vtkPointData.h>
 22 #include <vtkDoubleArray.h>
 23 #include <vtkLabeledDataMapper.h>
 24 #include <vtkPolyData.h>
 25 #include <vtkTextProperty.h>
 26 #include <vtkActor2D.h>
 27 
 28 VTK_MODULE_INIT(vtkInteractionStyle);
 29 VTK_MODULE_INIT(vtkRenderingFreeType);
 30 VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
 31 
 32 int main(int argc, char* argv[])
 33 {
 34     vtkNew<vtkUnstructuredGrid> grid;   /* 创建一个非结构化网格对象 */
 35     /*=============================网格节点=============================*/
 36     vtkNew<vtkPoints> meshPoints; /* 用于存储网格节点 */
 37     meshPoints->InsertNextPoint(20, 0, 0);
 38     meshPoints->InsertNextPoint(17.320508109792, 10.0000000321997, 0);
 39     meshPoints->InsertNextPoint(10.0000000084796, 17.3205081212641, 0);
 40     meshPoints->InsertNextPoint(0, 20, 0);
 41     meshPoints->InsertNextPoint(-10.0000000245946, 17.3205081142845, 0);
 42     meshPoints->InsertNextPoint(-17.320508106976, 10.0000000330863, 0);
 43     meshPoints->InsertNextPoint(-20, 0, 0);
 44     meshPoints->InsertNextPoint(-17.3205081361632, -9.99999998652343, 0);
 45     meshPoints->InsertNextPoint(-10.0000000640139, -17.3205080893384, 0);
 46     meshPoints->InsertNextPoint(0, -20, 0);
 47     meshPoints->InsertNextPoint(9.99999997546481, -17.3205081119126, 0);
 48     meshPoints->InsertNextPoint(17.3205080670077, -10.000000025522, 0);
 49     meshPoints->InsertNextPoint(-7.15966651257561, -7.12683602128246, 0);
 50     meshPoints->InsertNextPoint(-2.63739358105485, -12.9978938464381, 0);
 51     meshPoints->InsertNextPoint(-9.10592684278358, -0.737849316405346, 0);
 52     meshPoints->InsertNextPoint(6.59947131139743, -9.08284206416132, 0);
 53     meshPoints->InsertNextPoint(-0.137734590259206, -2.71811814272003, 0);
 54     meshPoints->InsertNextPoint(-7.75933677195531, 5.80947235781205, 0);
 55     meshPoints->InsertNextPoint(9.11726442880688, -1.21602962482667, 0);
 56     meshPoints->InsertNextPoint(-0.484322809037511, 4.65580556604978, 0);
 57     meshPoints->InsertNextPoint(-3.48354780828141, 10.4142340529639, 0);
 58     meshPoints->InsertNextPoint(7.28614335171517, 6.31993800133739, 0);
 59     meshPoints->InsertNextPoint(3.36376652373578, 13.053010718073, 0);
 60     grid->SetPoints(meshPoints);
 61     /*=================================================================*/
 62 
 63     /*=============================设置单元=============================*/
 64     vtkNew<vtkIdList> pointsId;
 65     pointsId->SetNumberOfIds(3);
 66     pointsId->SetId(0, 9);
 67     pointsId->SetId(1, 13);
 68     pointsId->SetId(2, 8);
 69     grid->InsertNextCell(VTK_TRIANGLE, 3, pointsId->GetPointer(0));
 70 
 71     pointsId->Initialize();
 72     pointsId->SetNumberOfIds(3);
 73     pointsId->SetId(0, 14);
 74     pointsId->SetId(1, 12);
 75     pointsId->SetId(2, 16);
 76     grid->InsertNextCell(VTK_TRIANGLE, 3, pointsId->GetPointer(0));
 77 
 78     pointsId->Initialize();
 79     pointsId->SetNumberOfIds(3);
 80     pointsId->SetId(0, 11);
 81     pointsId->SetId(1, 15);
 82     pointsId->SetId(2, 10);
 83     grid->InsertNextCell(VTK_TRIANGLE, 3, pointsId->GetPointer(0));
 84 
 85     pointsId->Initialize();
 86     pointsId->SetNumberOfIds(3);
 87     pointsId->SetId(0, 15);
 88     pointsId->SetId(1, 18);
 89     pointsId->SetId(2, 16);
 90     grid->InsertNextCell(VTK_TRIANGLE, 3, pointsId->GetPointer(0));
 91 
 92     pointsId->Initialize();
 93     pointsId->SetNumberOfIds(3);
 94     pointsId->SetId(0, 17);
 95     pointsId->SetId(1, 19);
 96     pointsId->SetId(2, 20);
 97     grid->InsertNextCell(VTK_TRIANGLE, 3, pointsId->GetPointer(0));
 98 
 99     pointsId->Initialize();
100     pointsId->SetNumberOfIds(3);
101     pointsId->SetId(0, 3);
102     pointsId->SetId(1, 22);
103     pointsId->SetId(2, 2);
104     grid->InsertNextCell(VTK_TRIANGLE, 3, pointsId->GetPointer(0));
105 
106     pointsId->Initialize();
107     pointsId->SetNumberOfIds(4);
108     pointsId->SetId(0, 8);
109     pointsId->SetId(1, 13);
110     pointsId->SetId(2, 12);
111     pointsId->SetId(3, 7);
112     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
113 
114     pointsId->Initialize();
115     pointsId->SetNumberOfIds(4);
116     pointsId->SetId(0, 12);
117     pointsId->SetId(1, 14);
118     pointsId->SetId(2, 6);
119     pointsId->SetId(3, 7);
120     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
121 
122     pointsId->Initialize();
123     pointsId->SetNumberOfIds(4);
124     pointsId->SetId(0, 13);
125     pointsId->SetId(1, 9);
126     pointsId->SetId(2, 10);
127     pointsId->SetId(3, 15);
128     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
129 
130     pointsId->Initialize();
131     pointsId->SetNumberOfIds(4);
132     pointsId->SetId(0, 6);
133     pointsId->SetId(1, 14);
134     pointsId->SetId(2, 17);
135     pointsId->SetId(3, 5);
136     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
137 
138     pointsId->Initialize();
139     pointsId->SetNumberOfIds(4);
140     pointsId->SetId(0, 16);
141     pointsId->SetId(1, 12);
142     pointsId->SetId(2, 13);
143     pointsId->SetId(3, 15);
144     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
145 
146     pointsId->Initialize();
147     pointsId->SetNumberOfIds(4);
148     pointsId->SetId(0, 14);
149     pointsId->SetId(1, 16);
150     pointsId->SetId(2, 19);
151     pointsId->SetId(3, 17);
152     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
153 
154     pointsId->Initialize();
155     pointsId->SetNumberOfIds(4);
156     pointsId->SetId(0, 17);
157     pointsId->SetId(1, 20);
158     pointsId->SetId(2, 4);
159     pointsId->SetId(3, 5);
160     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
161 
162     pointsId->Initialize();
163     pointsId->SetNumberOfIds(4);
164     pointsId->SetId(0, 16);
165     pointsId->SetId(1, 18);
166     pointsId->SetId(2, 21);
167     pointsId->SetId(3, 19);
168     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
169 
170     pointsId->Initialize();
171     pointsId->SetNumberOfIds(4);
172     pointsId->SetId(0, 15);
173     pointsId->SetId(1, 11);
174     pointsId->SetId(2, 0);
175     pointsId->SetId(3, 18);
176     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
177 
178     pointsId->Initialize();
179     pointsId->SetNumberOfIds(4);
180     pointsId->SetId(0, 20);
181     pointsId->SetId(1, 19);
182     pointsId->SetId(2, 21);
183     pointsId->SetId(3, 22);
184     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
185 
186     pointsId->Initialize();
187     pointsId->SetNumberOfIds(4);
188     pointsId->SetId(0, 22);
189     pointsId->SetId(1, 3);
190     pointsId->SetId(2, 4);
191     pointsId->SetId(3, 20);
192     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
193 
194     pointsId->Initialize();
195     pointsId->SetNumberOfIds(4);
196     pointsId->SetId(0, 21);
197     pointsId->SetId(1, 18);
198     pointsId->SetId(2, 0);
199     pointsId->SetId(3, 1);
200     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
201 
202     pointsId->Initialize();
203     pointsId->SetNumberOfIds(4);
204     pointsId->SetId(0, 2);
205     pointsId->SetId(1, 22);
206     pointsId->SetId(2, 21);
207     pointsId->SetId(3, 1);
208     grid->InsertNextCell(VTK_QUAD, 4, pointsId->GetPointer(0));
209     /*=================================================================*/
210 
211     /*==============================设置单元颜色========================*/
212     vtkNew<vtkFloatArray> color;                        /* 用于设置每个单元的随机颜色 */
213     for (int i = 0; i < grid->GetNumberOfCells(); ++i)
214     {
215         color->InsertNextValue(std::rand());
216     }
217     grid->GetCellData()->SetScalars(color);             /* 设置单元格的颜色 */
218     /*=================================================================*/
219 
220     /*==============================单元——>节点========================*/
221     double rangeMin = grid->GetScalarRange()[0];
222     double rangeMax = grid->GetScalarRange()[1];
223     vtkNew<vtkCellDataToPointData> theCellDataToPointData;
224     theCellDataToPointData->SetInputData(grid);
225     theCellDataToPointData->PassCellDataOn();
226     theCellDataToPointData->Update();
227     /*=================================================================*/
228 
229     /*============================等值线================================*/
230     vtkNew<vtkContourFilter> theContourFilter;
231     theContourFilter->SetInputData(theCellDataToPointData->GetOutput());
232     theContourFilter->GenerateValues(5, rangeMin, rangeMax);
233     theContourFilter->Update();
234     /*=================================================================*/
235 
236     /*============================等值线值标记===========================*/
237     // 用于将离散的三角面片拼接为连续的等值面
238     vtkNew<vtkStripper> theStripper;
239     theStripper->SetInputData(theContourFilter->GetOutput());
240     theStripper->Update();
241     // 等值线数目
242     vtkIdType lines = theStripper->GetOutput()->GetNumberOfLines();
243     vtkPoints* points = theStripper->GetOutput()->GetPoints();
244     vtkCellArray* cells = theStripper->GetOutput()->GetLines();
245     vtkDataArray* scalars = theStripper->GetOutput()->GetPointData()->GetScalars();
246     vtkNew<vtkPolyData> labelPolyData;
247     vtkNew<vtkPoints> labelPoints;
248     vtkNew<vtkDoubleArray> labelScalars;
249     labelScalars->SetNumberOfComponents(1);
250     labelScalars->SetName("IsoValues");
251 
252     // 创建单元数组迭代器
253     auto cellIter = vtk::TakeSmartPointer(cells->NewIterator());
254     for (cellIter->GoToFirstCell(); !cellIter->IsDoneWithTraversal(); cellIter->GoToNextCell())
255     {
256         vtkIdList* cell = cellIter->GetCurrentCell();
257         const vtkIdType samplePtIdx = static_cast<vtkIdType>(vtkMath::Random(0, cell->GetNumberOfIds()));
258         vtkIdType midPointId = cell->GetId(samplePtIdx);
259 
260         double midPoint[3];
261         points->GetPoint(midPointId, midPoint);
262         labelPoints->InsertNextPoint(midPoint);
263         labelScalars->InsertNextTuple1(scalars->GetTuple1(midPointId));
264     }
265     labelPolyData->SetPoints(labelPoints);
266 
267     labelPolyData->GetPointData()->SetScalars(labelScalars);
268     /*=================================================================*/
269 
270     vtkNew<vtkDataSetMapper> contourMapper;
271     contourMapper->SetInputData(theContourFilter->GetOutput());
272     vtkNew<vtkDataSetMapper> mapper;
273     mapper->SetInputData(theCellDataToPointData->GetOutput());
274     mapper->SetScalarModeToUsePointData();
275     mapper->SetScalarRange(rangeMin, rangeMax);
276 
277     vtkNew<vtkActor> contourActor;
278     contourActor->SetMapper(contourMapper);
279 
280     vtkNew<vtkActor> actor;
281     actor->SetMapper(mapper);
282 
283     vtkNew<vtkLabeledDataMapper> labelMapper;
284     labelMapper->SetFieldDataName("IsoValues");
285     labelMapper->SetInputData(labelPolyData);
286     labelMapper->SetLabelModeToLabelScalars();
287     labelMapper->SetLabelFormat("%6.2f");
288     labelMapper->GetLabelTextProperty()->SetColor(0, 0, 1);
289 
290     vtkNew<vtkActor2D> labelActor;
291     labelActor->SetMapper(labelMapper);
292 
293     vtkNew<vtkRenderer> renderer;
294     renderer->AddActor(actor);
295     renderer->AddActor(labelActor);
296     renderer->AddActor(contourActor);
297 
298     vtkNew<vtkRenderWindowInteractor> windowInteractor;
299     vtkNew<vtkRenderWindow> renderWindow;
300 
301     windowInteractor->SetRenderWindow(renderWindow);
302     renderWindow->AddRenderer(renderer);
303 
304 
305     renderWindow->Render();
306 
307     windowInteractor->Start();
308 
309     return 0;
310 }

原文地址:https://www.cnblogs.com/liusuanyatong/p/14319699.html

posted @ 2022-07-15 10:49  禅元天道  阅读(484)  评论(0编辑  收藏  举报