From bb70eedd4abb2225f4f69936257e9b2500d93e7a Mon Sep 17 00:00:00 2001 From: mbreit Date: Thu, 25 Feb 2021 16:21:23 +0100 Subject: [PATCH] Change in cylinder projector Use 1/2 * (minRadius + maxRadius) of the parent vertices as child vertex radius. This improves mesh quality on higher refinement levels for meshes with quadrilaterals, while triangle-based meshes are unaffected. --- .../refinement/projectors/cylinder_projector.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ugbase/lib_grid/refinement/projectors/cylinder_projector.h b/ugbase/lib_grid/refinement/projectors/cylinder_projector.h index ae06eb622..6831a5915 100644 --- a/ugbase/lib_grid/refinement/projectors/cylinder_projector.h +++ b/ugbase/lib_grid/refinement/projectors/cylinder_projector.h @@ -142,29 +142,30 @@ class CylinderProjector : public RefinementProjector { return 1; } - number avDist = 0; + number minDist = std::numeric_limits::max(); + number maxDist = -std::numeric_limits::max(); vector3 parentCenter (0, 0, 0); for(size_t i = 0; i < numVrts; ++i){ vector3 p = pos(vrts[i]); - avDist += DistancePointToRay(p, m_center, m_axis); + number distToRay = DistancePointToRay(p, m_center, m_axis); + minDist = std::min(minDist, distToRay); + maxDist = std::max(maxDist, distToRay); parentCenter += p; } - avDist /= (number)numVrts; + const number dist = 0.5 * (minDist + maxDist); VecScale(parentCenter, parentCenter, 1. / (number)numVrts); vector3 proj, v; ProjectPointToRay(proj, parentCenter, m_center, m_axis); VecSubtract(v, parentCenter, proj); number len = VecLength(v); - if(len > SMALL * avDist){ // if avDist is very small, len may be small, too - VecScale(v, v, avDist/len); + if(len > 1e-6 * dist){ // if avDist is very small, len may be small, too + VecScale(v, v, dist/len); proj += v; - set_pos(vrt, proj); } - else - set_pos(vrt, parentCenter); + set_pos(vrt, proj); if(m_influenceRadius > 0) { if(m_radius > m_influenceRadius){