TTK
Loading...
Searching...
No Matches
ttkQuadrangulationSubdivision.cpp
Go to the documentation of this file.
1#include <ttkMacros.h>
3#include <ttkUtils.h>
4
5#include <vtkCellData.h>
6#include <vtkFloatArray.h>
7#include <vtkIdTypeArray.h>
8#include <vtkInformation.h>
9#include <vtkPointData.h>
10#include <vtkPolyData.h>
11#include <vtkVersionMacros.h>
12
14
16 // MSC quadrangulation + initial 2D mesh
17 SetNumberOfInputPorts(2);
18 // quad mesh (containing ttkVertexIdentifiers of critical points)
19 SetNumberOfOutputPorts(1);
20}
21
23 int port, vtkInformation *info) {
24 if(port == 0) { // input quadrangulation
25 info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkPolyData");
26 return 1;
27 } else if(port == 1) { // triangulated domain
28 info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkDataSet");
29 return 1;
30 }
31 return 0;
32}
33
35 int port, vtkInformation *info) {
36 if(port == 0) {
37 info->Set(vtkDataObject::DATA_TYPE_NAME(), "vtkPolyData");
38 return 1;
39 }
40 return 0;
41}
42
44 vtkInformation *ttkNotUsed(request),
45 vtkInformationVector **inputVector,
46 vtkInformationVector *outputVector) {
47
48 auto quads = vtkPolyData::GetData(inputVector[0]);
49 auto mesh = vtkDataSet::GetData(inputVector[1]);
50 auto output = vtkPolyData::GetData(outputVector);
51
52 auto triangulation = ttkAlgorithm::GetTriangulation(mesh);
53 if(triangulation == nullptr) {
54 return 0;
55 }
56 this->preconditionTriangulation(triangulation);
57
58 auto inputCells = quads->GetPolys();
59#if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 6, 1)
60 if(inputCells == nullptr || inputCells->GetConnectivityArray() == nullptr) {
61#else
62 if(inputCells == nullptr || inputCells->GetData() == nullptr) {
63#endif
64 this->printErr("Invalid input quadrangle cells");
65 return 0;
66 }
67
68 auto inputPoints = quads->GetPoints();
69 auto pointData = quads->GetPointData();
70 if(inputPoints == nullptr || inputPoints->GetData() == nullptr
71 || pointData == nullptr) {
72 this->printErr("Invalid input quadrangle points");
73 return 0;
74 }
75
76 auto identifiers = pointData->GetArray(
77 static_cast<const char *>(ttk::VertexScalarFieldName));
78 if(identifiers == nullptr) {
79 this->printErr("Missing point data array named "
80 + std::string(ttk::VertexScalarFieldName));
81 return 0;
82 }
83
84 this->setInputQuads(
85 // get quads from PolyData's connectivity array
86 ttkUtils::GetVoidPointer(inputCells->GetConnectivityArray()),
87 inputCells->GetNumberOfCells());
88 this->setInputVertices(ttkUtils::GetVoidPointer(inputPoints->GetData()),
89 inputPoints->GetNumberOfPoints());
91 ttkUtils::GetVoidPointer(identifiers), identifiers->GetNumberOfTuples());
92
93 int res{-1};
95 triangulation->getType(),
96 res = this->execute(*static_cast<TTK_TT *>(triangulation->getData())));
97
98 if(res != 0) {
99 this->printWrn("Please increase the number of relaxation iterations, of "
100 "subdivision levels or consider another function (higher "
101 "eigenfunctions).");
102 if(!ShowResError) {
103 return 0;
104 }
105 }
106
107 vtkNew<vtkCellArray> cells{};
108
109 for(size_t i = 0; i < outputQuads_.size(); i++) {
110 cells->InsertNextCell(4, this->outputQuads_[i].data());
111 }
112
113 // update output: get quadrangle values
114 output->SetPolys(cells);
115
116 vtkNew<vtkPoints> points{};
117 for(size_t i = 0; i < outputPoints_.size(); ++i) {
118 points->InsertNextPoint(outputPoints_[i].data());
119 }
120
121 // update output: get quadrangle vertices
122 output->SetPoints(points);
123
124 // add data array of points valences
125 vtkNew<ttkSimplexIdTypeArray> valences{};
126 valences->SetName("Valence");
128 valences, outputValences_.data(), outputValences_.size(), 1);
129 output->GetPointData()->AddArray(valences);
130
131 vtkNew<vtkFloatArray> density{};
132 density->SetName("Density");
134 density, outputDensity_.data(), outputDensity_.size(), 1);
135 output->GetPointData()->AddArray(density);
136
137 vtkNew<vtkFloatArray> deformity{};
138 deformity->SetName("Deformity");
140 deformity, outputDifformity_.data(), outputDifformity_.size(), 1);
141 output->GetPointData()->AddArray(deformity);
142
143 // add data array of points infos
144 vtkNew<ttkSimplexIdTypeArray> infos{};
145 infos->SetName("Type");
147 infos, outputVertType_.data(), outputVertType_.size(), 1);
148 output->GetPointData()->AddArray(infos);
149
150 vtkNew<ttkSimplexIdTypeArray> subd{};
151 subd->SetName("Subdivision");
153 subd, outputSubdivision_.data(), outputSubdivision_.size(), 1);
154 output->GetPointData()->AddArray(subd);
155
156 vtkNew<ttkSimplexIdTypeArray> nearestVert{};
157 nearestVert->SetName(ttk::VertexScalarFieldName);
159 nearestVertexIdentifier_.size(), 1);
160 output->GetPointData()->AddArray(nearestVert);
161
162 if(QuadStatistics) {
163 vtkNew<vtkFloatArray> quadArea{};
164 quadArea->SetName("Quad Area");
165 ttkUtils::SetVoidArray(quadArea, quadArea_.data(), quadArea_.size(), 1);
166 output->GetCellData()->AddArray(quadArea);
167
168 vtkNew<vtkFloatArray> diagsRatio{};
169 diagsRatio->SetName("Diagonals Ratio");
171 diagsRatio, quadDiagsRatio_.data(), quadDiagsRatio_.size(), 1);
172 output->GetCellData()->AddArray(diagsRatio);
173
174 vtkNew<vtkFloatArray> edgesRatio{};
175 edgesRatio->SetName("Edges Ratio");
177 edgesRatio, quadEdgesRatio_.data(), quadEdgesRatio_.size(), 1);
178 output->GetCellData()->AddArray(edgesRatio);
179
180 vtkNew<vtkFloatArray> anglesRatio{};
181 anglesRatio->SetName("Angles Ratio");
183 anglesRatio, quadAnglesRatio_.data(), quadAnglesRatio_.size(), 1);
184 output->GetCellData()->AddArray(anglesRatio);
185
186 vtkNew<vtkFloatArray> hausDist{};
187 hausDist->SetName("Hausdorff");
188 ttkUtils::SetVoidArray(hausDist, hausdorff_.data(), hausdorff_.size(), 1);
189 output->GetPointData()->AddArray(hausDist);
190 }
191
192 // shallow copy input field data
193 output->GetFieldData()->ShallowCopy(mesh->GetFieldData());
194
195 return 1;
196}
#define ttkTemplateMacro(triangulationType, call)
#define ttkNotUsed(x)
Mark function/method parameters that are not used in the function body at all.
Definition BaseClass.h:47
ttk::Triangulation * GetTriangulation(vtkDataSet *dataSet)
TTK VTK-filter for surface quadrangulation.
int FillInputPortInformation(int port, vtkInformation *info) override
int FillOutputPortInformation(int port, vtkInformation *info) override
int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
static void * GetVoidPointer(vtkDataArray *array, vtkIdType start=0)
Definition ttkUtils.cpp:228
static void SetVoidArray(vtkDataArray *array, void *data, vtkIdType size, int save)
Definition ttkUtils.cpp:282
int printWrn(const std::string &msg, const debug::LineMode &lineMode=debug::LineMode::NEW, std::ostream &stream=std::cerr) const
Definition Debug.h:159
int printErr(const std::string &msg, const debug::LineMode &lineMode=debug::LineMode::NEW, std::ostream &stream=std::cerr) const
Definition Debug.h:149
void setInputVertices(void *const address, unsigned int size)
std::vector< SimplexId > nearestVertexIdentifier_
void preconditionTriangulation(AbstractTriangulation *const triangl)
void setInputVertexIdentifiers(void *const address, unsigned int size)
void setInputQuads(void *const address, unsigned int size)
const char VertexScalarFieldName[]
default name for vertex scalar field
Definition DataTypes.h:35
vtkStandardNewMacro(ttkQuadrangulationSubdivision)