ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
contour.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "contour.h"
9 
10 #include <VtkUtils/vtkutils.h>
11 #include <vtkActor.h>
12 #include <vtkContourFilter.h>
13 #include <vtkDelaunay2D.h>
14 #include <vtkDoubleArray.h>
15 #include <vtkLookupTable.h>
16 #include <vtkPoints.h>
17 #include <vtkPolyData.h>
18 #include <vtkPolyDataMapper.h>
19 #include <vtkRenderer.h>
20 
21 namespace VtkUtils {
22 class ContourPrivate {
23 public:
24  QList<Vector4F> vectors;
25 
26  int numberOfContours = 10;
27 
28  vtkActor* planeActor = nullptr;
29  vtkContourFilter* contour = nullptr;
30 };
31 
32 Contour::Contour(QWidget* parent) : Surface(parent) {
33  d_ptr = new ContourPrivate;
34 }
35 
36 Contour::~Contour() { delete d_ptr; }
37 
38 void Contour::setVectors(const QList<Vector4F>& vectors) {
39  if (vectors.isEmpty()) return;
40 
41  d_ptr->vectors = vectors;
42  renderSurface();
43 }
44 
46  if (d_ptr->numberOfContours != num) {
47  d_ptr->numberOfContours = num;
48 
49  if (d_ptr->contour)
50  d_ptr->contour->GenerateValues(d_ptr->numberOfContours, zMin(),
51  zMax());
52  }
53 }
54 
55 int Contour::numberOfContours() const { return d_ptr->numberOfContours; }
56 
57 void Contour::setPlaneVisible(bool visible) {}
58 
59 bool Contour::planeVisible() const { return false; }
60 
62 
63 bool Contour::planeDistance() const { return .0; }
64 
66  VTK_CREATE(vtkPoints, vtkpoints);
67  VTK_CREATE(vtkDoubleArray, scalars);
68 
69  foreach (const Vector4F& vec, d_ptr->vectors) {
70  vtkpoints->InsertNextPoint(vec.x, vec.y, vec.z);
71  scalars->InsertNextTuple1(vec.z);
72  }
73 
74  VTK_CREATE(vtkPolyData, polydata);
75  polydata->SetPoints(vtkpoints);
76  polydata->GetPointData()->SetScalars(scalars);
77 
78  double bounds[6];
79  polydata->GetBounds(bounds);
80  setBounds(bounds);
81 
82  VTK_CREATE(vtkDelaunay2D, del);
83  del->SetInputData(polydata);
84  del->Update();
85 
86  // VTK_CREATE(vtkContourFilter, contour);
87  // contour->SetInputConnection(del->GetOutputPort());
88  // contour->GenerateValues(10, bounds[4], bounds[5]);
89 
90  vtkLookupTable* lookupTable = vtkLookupTable::New();
91  lookupTable->SetTableRange(bounds[4], bounds[5]);
92  lookupTable->SetHueRange(0.667, 0.0);
93  lookupTable->Build();
94 
95  VTK_CREATE(vtkPolyDataMapper, mapper);
96  mapper->SetInputConnection(del->GetOutputPort());
97  mapper->SetLookupTable(lookupTable);
98 
99  surfaceActor()->SetMapper(mapper);
100  defaultRenderer()->AddActor(surfaceActor());
101 
102  update();
103 }
104 
105 } // namespace VtkUtils
int numberOfContours() const
Definition: contour.cpp:55
Contour(QWidget *parent=nullptr)
Definition: contour.cpp:32
bool planeVisible() const
Definition: contour.cpp:59
void setPlaneDistance(qreal distance)
Definition: contour.cpp:61
bool planeDistance() const
Definition: contour.cpp:63
void setVectors(const QList< Vector4F > &vectors)
Definition: contour.cpp:38
void setPlaneVisible(bool visible=true)
Definition: contour.cpp:57
void renderSurface()
Definition: contour.cpp:65
void setNumberOfContours(int num)
Definition: contour.cpp:45
vtkActor * surfaceActor() const
Definition: surface.cpp:65
vtkRenderer * defaultRenderer()
Definition: vtkwidget.cpp:313
double zMin() const
Definition: vtkwidget.cpp:357
void setBounds(double *bounds)
Definition: vtkwidget.cpp:344
double zMax() const
Definition: vtkwidget.cpp:359
static double distance(T *pot1, T *pot2)
Definition: utils.h:111
#define VTK_CREATE(type, name)