23#ifndef VCL_ALGORITHMS_MESH_UPDATE_QUALITY_H
24#define VCL_ALGORITHMS_MESH_UPDATE_QUALITY_H
26#include <vclib/algorithms/mesh/stat.h>
28#include <vclib/algorithms/core.h>
29#include <vclib/mesh.h>
40template<u
int ELEM_ID, MeshConcept MeshType,
typename QualityType>
41void setPerElementQuality(MeshType& mesh, QualityType quality)
43 requirePerElementComponent<ELEM_ID, CompId::QUALITY>(mesh);
46 mesh.template elements<ELEM_ID>() | vcl::views::quality, quality);
57template<u
int ELEM_ID, MeshConcept MeshType,
typename QualityType>
58void clampPerElementQuality(MeshType& mesh, QualityType minQ, QualityType maxQ)
60 requirePerElementComponent<ELEM_ID, CompId::QUALITY>(mesh);
62 for (
auto&& q : mesh.template elements<ELEM_ID>() | vcl::views::quality) {
63 q = std::clamp(q, minQ, maxQ);
75template<u
int ELEM_ID, MeshConcept MeshType,
typename QualityType>
76void normalizePerElementQuality(
81 requirePerElementComponent<ELEM_ID, CompId::QUALITY>(mesh);
83 QualityType range = maxQ - minQ;
84 auto [eMinQ, eMaxQ] = elementQualityMinMax<ELEM_ID>(mesh);
86 for (
auto&& q : mesh.template elements<ELEM_ID>() | vcl::views::quality) {
87 q = minQ + range * ((q - eMinQ) / (eMaxQ - eMinQ));
97template<MeshConcept MeshType,
typename QualityType>
98void setPerVertexQuality(MeshType& mesh, QualityType quality)
100 setPerElementQuality<ElemId::VERTEX>(mesh, quality);
109template<FaceMeshConcept MeshType,
typename QualityType>
110void setPerFaceQuality(MeshType& mesh, QualityType quality)
112 setPerElementQuality<ElemId::FACE>(mesh, quality);
122template<MeshConcept MeshType,
typename QualityType>
123void clampPerVertexQuality(MeshType& mesh, QualityType minQ, QualityType maxQ)
125 clampPerElementQuality<ElemId::VERTEX>(mesh, minQ, maxQ);
135template<FaceMeshConcept MeshType,
typename QualityType>
136void clampPerFaceQuality(MeshType& mesh, QualityType minQ, QualityType maxQ)
138 clampPerElementQuality<ElemId::FACE>(mesh, minQ, maxQ);
149template<MeshConcept MeshType,
typename QualityType>
150void normalizePerVertexQuality(
152 QualityType minQ = 0,
153 QualityType maxQ = 1)
155 normalizePerElementQuality<ElemId::VERTEX>(mesh, minQ, maxQ);
166template<FaceMeshConcept MeshType,
typename QualityType>
167void normalizePerFaceQuality(
169 QualityType minQ = 0,
170 QualityType maxQ = 1)
172 normalizePerElementQuality<ElemId::FACE>(mesh, minQ, maxQ);
187template<FaceMeshConcept MeshType>
188void setPerVertexQualityFromVertexValence(MeshType& m)
190 requirePerVertexQuality(m);
192 using VertexType = MeshType::VertexType;
193 using FaceType = MeshType::FaceType;
195 setPerVertexQuality(m, 0);
197 for (FaceType& f : m.
faces()) {
198 for (VertexType* v : f.
vertices()) {
214template<FaceMeshConcept MeshType>
215void setPerFaceQualityFromFaceArea(MeshType& m)
219 using FaceType = MeshType::FaceType;
221 for (FaceType& f : m.
faces()) {
226template<MeshConcept MeshType>
227void setPerVertexQualityFromPrincipalCurvatureGaussian(MeshType& m)
229 requirePerVertexQuality(m);
230 requirePerVertexPrincipalCurvature(m);
232 using VertexType = MeshType::VertexType;
234 for (VertexType& v : m.
vertices()) {
235 v.quality() = v.principalCurvature().maxValue() *
236 v.principalCurvature().minValue();
240template<MeshConcept MeshType>
241void setPerVertexQualityFromPrincipalCurvatureMean(MeshType& m)
243 requirePerVertexQuality(m);
244 requirePerVertexPrincipalCurvature(m);
246 using VertexType = MeshType::VertexType;
248 for (VertexType& v : m.
vertices()) {
249 v.quality() = (v.principalCurvature().maxValue() +
250 v.principalCurvature().minValue()) /
255template<MeshConcept MeshType>
256void setPerVertexQualityFromPrincipalCurvatureMinValue(MeshType& m)
258 requirePerVertexQuality(m);
259 requirePerVertexPrincipalCurvature(m);
261 using VertexType = MeshType::VertexType;
263 for (VertexType& v : m.
vertices()) {
264 v.quality() = v.principalCurvature().minValue();
268template<MeshConcept MeshType>
269void setPerVertexQualityFromPrincipalCurvatureMaxValue(MeshType& m)
271 requirePerVertexQuality(m);
272 requirePerVertexPrincipalCurvature(m);
274 using VertexType = MeshType::VertexType;
276 for (VertexType& v : m.
vertices()) {
277 v.quality() = v.principalCurvature().maxValue();
292template<MeshConcept MeshType>
293void setPerVertexQualityFromPrincipalCurvatureShapeIndex(MeshType& m)
295 requirePerVertexQuality(m);
296 requirePerVertexPrincipalCurvature(m);
298 using VertexType = MeshType::VertexType;
299 using ScalarType = VertexType::PrincipalCurvatureType::ScalarType;
301 for (VertexType& v : m.
vertices()) {
302 ScalarType k1 = v.principalCurvature().maxValue();
303 ScalarType k2 = v.principalCurvature().minValue();
306 v.quality() = (2.0 / M_PI) * std::atan2(k1 + k2, k1 - k2);
321template<MeshConcept MeshType>
322void setPerVertexQualityFromPrincipalCurvatureCurvedness(MeshType& m)
324 requirePerVertexQuality(m);
325 requirePerVertexPrincipalCurvature(m);
327 using VertexType = MeshType::VertexType;
328 using ScalarType = VertexType::PrincipalCurvatureType::ScalarType;
330 for (VertexType& v : m.
vertices()) {
331 ScalarType k1 = v.principalCurvature().maxValue();
332 ScalarType k2 = v.principalCurvature().minValue();
334 v.quality() = std::sqrt((k1 * k1 + k2 * k2) / 2.0);
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:1250
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