From a87e6edddf9a49a70861b97cd625e9e373d6b39f Mon Sep 17 00:00:00 2001 From: Karsten Rink <karsten.rink@ufz.de> Date: Thu, 24 Jul 2014 15:27:29 +0200 Subject: [PATCH] added missing method for pyramid-elements to edge-ratio metric --- MeshLib/MeshQuality/EdgeRatioMetric.cpp | 27 +++++++++++++++++++++++++ MeshLib/MeshQuality/EdgeRatioMetric.h | 1 + 2 files changed, 28 insertions(+) diff --git a/MeshLib/MeshQuality/EdgeRatioMetric.cpp b/MeshLib/MeshQuality/EdgeRatioMetric.cpp index deb85fdb5a7..7c2cb981430 100644 --- a/MeshLib/MeshQuality/EdgeRatioMetric.cpp +++ b/MeshLib/MeshQuality/EdgeRatioMetric.cpp @@ -55,6 +55,13 @@ void EdgeRatioMetric::calculateQuality() _element_quality_metric[k] = checkPrism(pnts); break; } + case MeshElemType::PYRAMID: { + std::vector<const GeoLib::Point*> pnts; + for (size_t j(0); j < 5; j++) + pnts.push_back(elem->getNode(j)); + _element_quality_metric[k] = checkPyramid(pnts); + break; + } case MeshElemType::HEXAHEDRON: { std::vector<const GeoLib::Point*> pnts; for (size_t j(0); j < 8; j++) @@ -161,6 +168,26 @@ double EdgeRatioMetric::checkPrism (std::vector<const GeoLib::Point*> const & pn return sqrt(sqr_lengths[0]) / sqrt(sqr_lengths[8]); } +double EdgeRatioMetric::checkPyramid (std::vector<const GeoLib::Point*> const & pnts) const +{ + double sqr_lengths[8] = {MathLib::sqrDist (*pnts[0],*pnts[1]), + MathLib::sqrDist (*pnts[1],*pnts[2]), + MathLib::sqrDist (*pnts[2],*pnts[3]), + MathLib::sqrDist (*pnts[3],*pnts[0]), + MathLib::sqrDist (*pnts[0],*pnts[4]), + MathLib::sqrDist (*pnts[1],*pnts[4]), + MathLib::sqrDist (*pnts[2],*pnts[4]), + MathLib::sqrDist (*pnts[3],*pnts[4])}; + + // sort lengths - since this is a very small array we use bubble sort + for (size_t i(0); i < 8; i++) + for (size_t j(i + 1); j < 8; j++) + if (sqr_lengths[i] >= sqr_lengths[j]) + std::swap (sqr_lengths[i], sqr_lengths[j]); + + return sqrt(sqr_lengths[0]) / sqrt(sqr_lengths[7]); +} + double EdgeRatioMetric::checkHexahedron (std::vector<const GeoLib::Point*> const & pnts) const { double sqr_lengths[12] = {MathLib::sqrDist (*pnts[0],*pnts[1]), diff --git a/MeshLib/MeshQuality/EdgeRatioMetric.h b/MeshLib/MeshQuality/EdgeRatioMetric.h index 66a10b34153..45b2148820c 100644 --- a/MeshLib/MeshQuality/EdgeRatioMetric.h +++ b/MeshLib/MeshQuality/EdgeRatioMetric.h @@ -45,6 +45,7 @@ private: GeoLib::Point const* const c, GeoLib::Point const* const d) const; double checkPrism (std::vector<const GeoLib::Point*> const & pnts) const; + double checkPyramid (std::vector<const GeoLib::Point*> const & pnts) const; double checkHexahedron (std::vector<const GeoLib::Point*> const & pnts) const; }; } -- GitLab