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