ITK  6.0.0
Insight Toolkit
itkQuadEdgeMeshEulerOperatorsTestHelper.h
Go to the documentation of this file.
1/*=========================================================================
2 *
3 * Copyright NumFOCUS
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0.txt
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *=========================================================================*/
18#ifndef itkQuadEdgeMeshEulerOperatorsTestHelper_h
19#define itkQuadEdgeMeshEulerOperatorsTestHelper_h
20
23
24using IdentifierType = unsigned long;
25
26template <typename TMesh>
27bool
29 IdentifierType NumVertices,
30 IdentifierType NumFaces,
31 IdentifierType NumEdges,
32 IdentifierType NumBorders,
33 IdentifierType Genus)
34{
36 auto check = CheckerType::New();
37 check->SetMesh(mesh);
38 check->SetExpectedNumberOfPoints(NumVertices);
39 check->SetExpectedNumberOfEdges(NumFaces);
40 check->SetExpectedNumberOfFaces(NumEdges);
41 check->SetExpectedNumberOfBoundaries(NumBorders);
42 check->SetExpectedGenus(Genus);
43 return (check->ValidateEulerCharacteristic());
44}
45
46//----------------------------------------------------------------------------
47template <typename TMesh>
48std::vector<typename TMesh::PointType>
49GeneratePointCoordinates(const unsigned int iN)
50{
51 using PointType = typename TMesh::PointType;
52 using CoordinateType = typename PointType::CoordinateType;
53 std::vector<PointType> oPt(iN * iN);
54
55 for (unsigned int i = 0; i < iN; ++i)
56 {
57 for (unsigned int j = 0; j < iN; ++j)
58 {
59 oPt[i * iN + j][0] = static_cast<CoordinateType>(j);
60 oPt[i * iN + j][1] = static_cast<CoordinateType>(i);
61 oPt[i * iN + j][2] = static_cast<CoordinateType>(0.);
62 }
63 }
64
65 return oPt;
66}
67
68//----------------------------------------------------------------------------
69template <typename TMesh>
70void
72{
73 using MeshType = TMesh;
74 using CellType = typename MeshType::CellType;
75
76 using QEPolygonCellType = itk::QuadEdgeMeshPolygonCell<CellType>;
77
78 if (mesh->GetNumberOfPoints())
79 {
80 mesh->Clear();
81 mesh->ClearFreePointAndCellIndexesLists();
82 }
83
85 constexpr int expectedNumPts = 25;
86 constexpr int expectedNumCells = 16;
87 const int simpleSquareCells[64] = { 0, 1, 6, 5, 1, 2, 7, 6, 2, 3, 8, 7, 3, 4, 9, 8,
88 5, 6, 11, 10, 6, 7, 12, 11, 7, 8, 13, 12, 8, 9, 14, 13,
89 10, 11, 16, 15, 11, 12, 17, 16, 12, 13, 18, 17, 13, 14, 19, 18,
90 15, 16, 21, 20, 16, 17, 22, 21, 17, 18, 23, 22, 18, 19, 24, 23 };
91
92 using PointType = typename MeshType::PointType;
93
94 std::vector<PointType> pts = GeneratePointCoordinates<MeshType>(5);
95
96 for (int i = 0; i < expectedNumPts; ++i)
97 {
98 mesh->SetPoint(i, pts[i]);
99 }
100
101 typename CellType::CellAutoPointer cellpointer;
102 QEPolygonCellType * poly;
103
104 for (int i = 0; i < expectedNumCells; ++i)
105 {
106 poly = new QEPolygonCellType(4);
107 cellpointer.TakeOwnership(poly);
108 cellpointer->SetPointId(0, simpleSquareCells[4 * i]);
109 cellpointer->SetPointId(1, simpleSquareCells[4 * i + 1]);
110 cellpointer->SetPointId(2, simpleSquareCells[4 * i + 2]);
111 cellpointer->SetPointId(3, simpleSquareCells[4 * i + 3]);
112 mesh->SetCell(i, cellpointer);
113 }
114}
115
116//----------------------------------------------------------------------------
117template <typename TMesh>
118void
120{
121 using MeshType = TMesh;
122 using CellType = typename MeshType::CellType;
123
124 using QEPolygonCellType = itk::QuadEdgeMeshPolygonCell<CellType>;
125
126 if (mesh->GetNumberOfPoints())
127 {
128 mesh->Clear();
129 mesh->ClearFreePointAndCellIndexesLists();
130 }
131
133 constexpr int expectedNumPts = 25;
134 constexpr int expectedNumCells = 32;
135 const int simpleSquareCells[96] = { 0, 1, 6, 0, 6, 5, 1, 2, 7, 1, 7, 6, 2, 3, 8, 2, 8, 7, 3, 4,
136 9, 3, 9, 8, 5, 6, 11, 5, 11, 10, 6, 7, 12, 6, 12, 11, 7, 8, 13, 7,
137 13, 12, 8, 9, 14, 8, 14, 13, 10, 11, 16, 10, 16, 15, 11, 12, 17, 11, 17, 16,
138 12, 13, 18, 12, 18, 17, 13, 14, 19, 13, 19, 18, 15, 16, 21, 15, 21, 20, 16, 17,
139 22, 16, 22, 21, 17, 18, 23, 17, 23, 22, 18, 19, 24, 18, 24, 23 };
140
141 using PointType = typename TMesh::PointType;
142 std::vector<PointType> pts = GeneratePointCoordinates<TMesh>(5);
143
144 for (int i = 0; i < expectedNumPts; ++i)
145 {
146 mesh->SetPoint(i, pts[i]);
147 }
148
149 typename CellType::CellAutoPointer cellpointer;
150 QEPolygonCellType * poly;
151
152 for (int i = 0; i < expectedNumCells; ++i)
153 {
154 poly = new QEPolygonCellType(3);
155 cellpointer.TakeOwnership(poly);
156 cellpointer->SetPointId(0, simpleSquareCells[3 * i]);
157 cellpointer->SetPointId(1, simpleSquareCells[3 * i + 1]);
158 cellpointer->SetPointId(2, simpleSquareCells[3 * i + 2]);
159 mesh->SetCell(i, cellpointer);
160 }
161}
162
163//----------------------------------------------------------------------------
164template <typename TMesh>
165void
167{
168 using MeshType = TMesh;
169 using CellType = typename MeshType::CellType;
170
171 using QEPolygonCellType = itk::QuadEdgeMeshPolygonCell<CellType>;
172
173 if (mesh->GetNumberOfPoints())
174 {
175 mesh->Clear();
176 mesh->ClearFreePointAndCellIndexesLists();
177 }
178
180 constexpr int expectedNumPts = 4;
181 constexpr int expectedNumCells = 4;
182 const int simpleSquareCells[12] = { 0, 1, 2, 1, 0, 3, 1, 3, 2, 2, 3, 0 };
183
184 using PointType = typename TMesh::PointType;
185 std::vector<PointType> pts(4);
186 {
187 int i(0);
188 pts[i][0] = 0.;
189 pts[i][1] = 1.;
190 pts[i++][2] = 0.;
191 pts[i][0] = 0.;
192 pts[i][1] = -1.;
193 pts[i++][2] = 0.;
194 pts[i][0] = -1.;
195 pts[i][1] = 0.;
196 pts[i++][2] = 0.;
197 pts[i][0] = 0.;
198 pts[i][1] = 0.;
199 pts[i++][2] = 1.;
200 }
201 for (int i = 0; i < expectedNumPts; ++i)
202 {
203 mesh->SetPoint(i, pts[i]);
204 }
205
206 typename CellType::CellAutoPointer cellpointer;
207
208 for (int i = 0; i < expectedNumCells; ++i)
209 {
210 QEPolygonCellType * poly = new QEPolygonCellType(3);
211 cellpointer.TakeOwnership(poly);
212 cellpointer->SetPointId(0, simpleSquareCells[3 * i]);
213 cellpointer->SetPointId(1, simpleSquareCells[3 * i + 1]);
214 cellpointer->SetPointId(2, simpleSquareCells[3 * i + 2]);
215 mesh->SetCell(i, cellpointer);
216 }
217}
218
219
220//----------------------------------------------------------------------------
221template <typename TMesh>
222void
224{
225 using MeshType = TMesh;
226 using CellType = typename MeshType::CellType;
227
228 using QEPolygonCellType = itk::QuadEdgeMeshPolygonCell<CellType>;
229
230 if (mesh->GetNumberOfPoints())
231 {
232 mesh->Clear();
233 mesh->ClearFreePointAndCellIndexesLists();
234 }
235
237 constexpr int expectedNumPts = 3;
238 constexpr int expectedNumCells = 2;
239 const int simpleSquareCells[6] = { 0, 1, 2, 1, 0, 2 };
240
241 using PointType = typename TMesh::PointType;
242 std::vector<PointType> pts(3);
243 {
244 int i(0);
245 pts[i][0] = 0.;
246 pts[i][1] = 1.;
247 pts[i++][2] = 0.;
248 pts[i][0] = 0.;
249 pts[i][1] = -1.;
250 pts[i++][2] = 0.;
251 pts[i][0] = -1.;
252 pts[i][1] = 0.;
253 pts[i++][2] = 0.;
254 }
255 for (int i = 0; i < expectedNumPts; ++i)
256 {
257 mesh->SetPoint(i, pts[i]);
258 }
259
260 typename CellType::CellAutoPointer cellpointer;
261 for (int i = 0; i < expectedNumCells; ++i)
262 {
263 QEPolygonCellType * poly = new QEPolygonCellType(3);
264 cellpointer.TakeOwnership(poly);
265 cellpointer->SetPointId(0, simpleSquareCells[3 * i]);
266 cellpointer->SetPointId(1, simpleSquareCells[3 * i + 1]);
267 cellpointer->SetPointId(2, simpleSquareCells[3 * i + 2]);
268 mesh->SetCell(i, cellpointer);
269 }
270}
271
272
273#endif
Make some basic checks in order to verify that the considered mesh is not degenerated and correctly r...
static Pointer New()
SmartPointer< Self > Pointer
void CreateSamosa(typename TMesh::Pointer mesh)
bool AssertTopologicalInvariants(TMesh *mesh, IdentifierType NumVertices, IdentifierType NumFaces, IdentifierType NumEdges, IdentifierType NumBorders, IdentifierType Genus)
void CreateSquareQuadMesh(typename TMesh::Pointer mesh)
std::vector< typename TMesh::PointType > GeneratePointCoordinates(const unsigned int iN)
void CreateTetraedronMesh(typename TMesh::Pointer mesh)
unsigned long IdentifierType
void CreateSquareTriangularMesh(typename TMesh::Pointer mesh)