diff --git a/Geo/MFace.cpp b/Geo/MFace.cpp index 10c407262e39aa2a9f50658775153663ca5f796b..725cb2530c38b3ad9d53adb8669c56c9a04643c6 100644 --- a/Geo/MFace.cpp +++ b/Geo/MFace.cpp @@ -57,6 +57,15 @@ MFace::MFace(std::vector<MVertex*> v) sortVertices(_v,_si); } +double MFace::approximateArea() const +{ + SPoint3 p0 = _v[0]->point(), p1 = _v[1]->point(), p2 = _v[2]->point(); + double a = triangle_area(p0, p1, p2); + if (_v.size() == 3) return a; + a += triangle_area(p0, p2, _v[3]->point()); + return a; +} + SVector3 MFace::normal() const { double n[3]; diff --git a/Geo/MFace.h b/Geo/MFace.h index 4cf0fc8c97ffa44dd91e9cf139d0b99b17c2c382..cbb072fcc683534fb1bd08a09a7fe48d326730b4 100644 --- a/Geo/MFace.h +++ b/Geo/MFace.h @@ -43,6 +43,7 @@ class MFace { for(int i = 0; i < getNumVertices(); i++) verts[i] = getSortedVertex(i); } + double approximateArea() const; SVector3 normal() const; SVector3 tangent(int num) const { diff --git a/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp b/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp index f056d5850655c40e4031652f7da78155215caf35..cd3b6cdaaf77fa66c7fe2f5bce05246e4ca9e9b2 100644 --- a/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp +++ b/contrib/HighOrderMeshOptimizer/OptHomFastCurving.cpp @@ -317,13 +317,13 @@ void getOppositeFacePrism(MElement *el, const MFace &elBaseFace, elTopFace = MFace(topVert); // Compute min. (side faces) and max. (top face) face areas - faceSurfMax = elTopFace.area(); + faceSurfMax = elTopFace.approximateArea(); MFace sideFace0 = el->getFace(2); - faceSurfMin = sideFace0.area(); + faceSurfMin = sideFace0.approximateArea(); MFace sideFace1 = el->getFace(3); - faceSurfMin = std::min(faceSurfMin, sideFace1.area()); + faceSurfMin = std::min(faceSurfMin, sideFace1.approximateArea()); MFace sideFace2 = el->getFace(4); - faceSurfMin = std::min(faceSurfMin, sideFace2.area()); + faceSurfMin = std::min(faceSurfMin, sideFace2.approximateArea()); } @@ -364,15 +364,15 @@ void getOppositeFaceHex(MElement *el, const MFace &elBaseFace, MFace &elTopFace, elTopFace = MFace(topVert); // Compute min. (side faces) and max. (top face) face areas - faceSurfMax = elTopFace.area(); + faceSurfMax = elTopFace.approximateArea(); MFace sideFace0 = el->getFace(sideFace[0]); - faceSurfMin = sideFace0.area(); + faceSurfMin = sideFace0.approximateArea(); MFace sideFace1 = el->getFace(sideFace[1]); - faceSurfMin = std::min(faceSurfMin, sideFace1.area()); + faceSurfMin = std::min(faceSurfMin, sideFace1.approximateArea()); MFace sideFace2 = el->getFace(sideFace[2]); - faceSurfMin = std::min(faceSurfMin, sideFace2.area()); + faceSurfMin = std::min(faceSurfMin, sideFace2.approximateArea()); MFace sideFace3 = el->getFace(sideFace[3]); - faceSurfMin = std::min(faceSurfMin, sideFace3.area()); + faceSurfMin = std::min(faceSurfMin, sideFace3.approximateArea()); } @@ -392,7 +392,7 @@ void getOppositeFaceTet(MElement *el, const MFace &elBaseFace, MFace &elTopFace, for (int iElFace = 0; iElFace < el->getNumFaces(); iElFace++) { if (iElFace != iElBaseFace) { MFace faceTest = el->getFace(iElFace); - const double faceSurfTest = faceTest.area(); + const double faceSurfTest = faceTest.approximateArea(); if (faceSurfTest < faceSurfMin) faceSurfMin = faceSurfTest; if (faceSurfTest > faceSurfMax) { faceSurfMax = faceSurfTest;