Visual Computing Library  devel
Loading...
Searching...
No Matches
quality.h
1/*****************************************************************************
2 * VCLib *
3 * Visual Computing Library *
4 * *
5 * Copyright(C) 2021-2025 *
6 * Visual Computing Lab *
7 * ISTI - Italian National Research Council *
8 * *
9 * All rights reserved. *
10 * *
11 * This program is free software; you can redistribute it and/or modify *
12 * it under the terms of the Mozilla Public License Version 2.0 as published *
13 * by the Mozilla Foundation; either version 2 of the License, or *
14 * (at your option) any later version. *
15 * *
16 * This program is distributed in the hope that it will be useful, *
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19 * Mozilla Public License Version 2.0 *
20 * (https://www.mozilla.org/en-US/MPL/2.0/) for more details. *
21 ****************************************************************************/
22
23#ifndef VCL_ALGORITHMS_MESH_UPDATE_QUALITY_H
24#define VCL_ALGORITHMS_MESH_UPDATE_QUALITY_H
25
26#include <vclib/algorithms/mesh/stat.h>
27
28#include <vclib/algorithms/core.h>
29#include <vclib/mesh.h>
30
31namespace vcl {
32
44template<MeshConcept MeshType>
45void setPerVertexQuality(
46 MeshType& m,
47 typename MeshType::VertexType::QualityType s)
48{
49 requirePerVertexQuality(m);
50
51 using VertexType = MeshType::VertexType;
52
53 for (VertexType& v : m.vertices()) {
54 v.quality() = s;
55 }
56}
57
69template<FaceMeshConcept MeshType>
70void setPerFaceQuality(MeshType& m, typename MeshType::FaceType::QualityType s)
71{
73
74 using FaceType = MeshType::FaceType;
75
76 for (FaceType& f : m.faces()) {
77 f.quality() = s;
78 }
79}
80
93template<MeshConcept MeshType>
94void clampPerVertexQuality(
95 MeshType& m,
96 typename MeshType::VertexType::QualityType minS,
97 typename MeshType::VertexType::QualityType maxS)
98{
99 requirePerVertexQuality(m);
100
101 using VertexType = MeshType::VertexType;
102
103 for (VertexType& v : m.vertices()) {
104 v.quality() = std::min(maxS, std::max(minS, v.quality()));
105 }
106}
107
120template<FaceMeshConcept MeshType>
121void clampPerFaceQuality(
122 MeshType& m,
123 typename MeshType::FaceType::QualityType minS,
124 typename MeshType::FaceType::QualityType maxS)
125{
127
128 using FaceType = MeshType::FaceType;
129
130 for (FaceType& f : m.faces()) {
131 f.quality() = std::min(maxS, std::max(minS, f.quality()));
132 }
133}
134
148template<MeshConcept MeshType>
149void normalizePerVertexQuality(
150 MeshType& m,
151 typename MeshType::VertexType::QualityType minS = 0,
152 typename MeshType::VertexType::QualityType maxS = 1)
153{
154 requirePerVertexQuality(m);
155
156 using VertexType = MeshType::VertexType;
157 using QualityType = VertexType::QualityType;
158
159 QualityType range = maxS - minS;
160 std::pair<QualityType, QualityType> p = vertexQualityMinMax(m);
161
162 for (VertexType& v : m.vertices()) {
163 v.quality() =
164 minS + range * ((v.quality() - p.first) / (p.second - p.first));
165 }
166}
167
181template<FaceMeshConcept MeshType>
182void normalizePerFaceQuality(
183 MeshType& m,
184 typename MeshType::FaceType::QualityType minS = 0,
185 typename MeshType::FaceType::QualityType maxS = 1)
186{
188
189 using FaceType = MeshType::FaceType;
190 using QualityType = FaceType::QualityType;
191
192 QualityType range = maxS - minS;
193 std::pair<QualityType, QualityType> p = faceQualityMinMax(m);
194
195 for (FaceType& f : m.faces()) {
196 f.quality() =
197 minS + range * ((f.quality() - p.first) / (p.second - p.first));
198 }
199}
200
213template<FaceMeshConcept MeshType>
214void setPerVertexQualityFromVertexValence(MeshType& m)
215{
216 requirePerVertexQuality(m);
217
218 using VertexType = MeshType::VertexType;
219 using FaceType = MeshType::FaceType;
220
221 setPerVertexQuality(m, 0);
222
223 for (FaceType& f : m.faces()) {
224 for (VertexType* v : f.vertices()) {
225 v->quality() += 1;
226 }
227 }
228}
229
240template<FaceMeshConcept MeshType>
241void setPerFaceQualityFromFaceArea(MeshType& m)
242{
244
245 using FaceType = MeshType::FaceType;
246
247 for (FaceType& f : m.faces()) {
248 f.quality() = faceArea(f);
249 }
250}
251
252template<MeshConcept MeshType>
253void setPerVertexQualityFromPrincipalCurvatureGaussian(MeshType& m)
254{
255 requirePerVertexQuality(m);
256 requirePerVertexPrincipalCurvature(m);
257
258 using VertexType = MeshType::VertexType;
259
260 for (VertexType& v : m.vertices()) {
261 v.quality() = v.principalCurvature().maxValue() *
262 v.principalCurvature().minValue();
263 }
264}
265
266template<MeshConcept MeshType>
267void setPerVertexQualityFromPrincipalCurvatureMean(MeshType& m)
268{
269 requirePerVertexQuality(m);
270 requirePerVertexPrincipalCurvature(m);
271
272 using VertexType = MeshType::VertexType;
273
274 for (VertexType& v : m.vertices()) {
275 v.quality() = (v.principalCurvature().maxValue() +
276 v.principalCurvature().minValue()) /
277 2;
278 }
279}
280
281template<MeshConcept MeshType>
282void setPerVertexQualityFromPrincipalCurvatureMinValue(MeshType& m)
283{
284 requirePerVertexQuality(m);
285 requirePerVertexPrincipalCurvature(m);
286
287 using VertexType = MeshType::VertexType;
288
289 for (VertexType& v : m.vertices()) {
290 v.quality() = v.principalCurvature().minValue();
291 }
292}
293
294template<MeshConcept MeshType>
295void setPerVertexQualityFromPrincipalCurvatureMaxValue(MeshType& m)
296{
297 requirePerVertexQuality(m);
298 requirePerVertexPrincipalCurvature(m);
299
300 using VertexType = MeshType::VertexType;
301
302 for (VertexType& v : m.vertices()) {
303 v.quality() = v.principalCurvature().maxValue();
304 }
305}
306
318template<MeshConcept MeshType>
319void setPerVertexQualityFromPrincipalCurvatureShapeIndex(MeshType& m)
320{
321 requirePerVertexQuality(m);
322 requirePerVertexPrincipalCurvature(m);
323
324 using VertexType = MeshType::VertexType;
325 using ScalarType = VertexType::PrincipalCurvatureType::ScalarType;
326
327 for (VertexType& v : m.vertices()) {
328 ScalarType k1 = v.principalCurvature().maxValue();
329 ScalarType k2 = v.principalCurvature().minValue();
330 if (k1 < k2)
331 std::swap(k1, k2);
332 v.quality() = (2.0 / M_PI) * std::atan2(k1 + k2, k1 - k2);
333 }
334}
335
347template<MeshConcept MeshType>
348void setPerVertexQualityFromPrincipalCurvatureCurvedness(MeshType& m)
349{
350 requirePerVertexQuality(m);
351 requirePerVertexPrincipalCurvature(m);
352
353 using VertexType = MeshType::VertexType;
354 using ScalarType = VertexType::PrincipalCurvatureType::ScalarType;
355
356 for (VertexType& v : m.vertices()) {
357 ScalarType k1 = v.principalCurvature().maxValue();
358 ScalarType k2 = v.principalCurvature().minValue();
359
360 v.quality() = std::sqrt((k1 * k1 + k2 * k2) / 2.0);
361 }
362}
363
364} // namespace vcl
365
366#endif // VCL_ALGORITHMS_MESH_UPDATE_QUALITY_H
auto faceArea(const FaceType &f)
Computes the area of a face. Works both for triangle and polygonal faces, and it is optimized in case...
Definition geometry.h:108
void requirePerFaceQuality(const MeshType &m)
This function asserts that a Mesh has a FaceContainer, the Face has a Quality Component,...
Definition face_requirements.h:1137
constexpr detail::FacesView faces
A view that allows to iterate overt the Face elements of an object.
Definition face.h:84
constexpr detail::VerticesView vertices
A view that allows to iterate over the Vertex elements of an object.
Definition vertex.h:92