From: oan Date: Sat, 1 Feb 2025 00:22:19 +0000 (+0000) Subject: Foundation Classes - BVH surface area calculation for transformed boxes #322 X-Git-Tag: V7_9_0_beta1~14 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=60360e3204795dc4184f5b947218bf9a73a65629;p=occt.git Foundation Classes - BVH surface area calculation for transformed boxes #322 BVH::SurfaceCalculator::Area() fails to calculate area of transformed box. Use absolute values of intermediate calculations to compute surface area of a box, so they do not diminish each other. --- diff --git a/src/BVH/BVH_Box.hxx b/src/BVH/BVH_Box.hxx index 6f808d31f5..2bae241ffe 100644 --- a/src/BVH/BVH_Box.hxx +++ b/src/BVH/BVH_Box.hxx @@ -427,11 +427,11 @@ struct SurfaceCalculator { static T Area(const typename BVH_Box::BVH_VecNt& theSize) { - const T anArea = theSize.x() * theSize.y(); + const T anArea = std::abs(theSize.x() * theSize.y()); if (anArea < std::numeric_limits::epsilon()) { - return theSize.x() + theSize.y(); + return std::abs(theSize.x()) + std::abs(theSize.y()); } return anArea; @@ -443,13 +443,13 @@ struct SurfaceCalculator { static T Area(const typename BVH_Box::BVH_VecNt& theSize) { - const T anArea = - (theSize.x() * theSize.y() + theSize.x() * theSize.z() + theSize.z() * theSize.y()) - * static_cast(2.0); + const T anArea = (std::abs(theSize.x() * theSize.y()) + std::abs(theSize.x() * theSize.z()) + + std::abs(theSize.z() * theSize.y())) + * static_cast(2.0); if (anArea < std::numeric_limits::epsilon()) { - return theSize.x() + theSize.y() + theSize.z(); + return std::abs(theSize.x()) + std::abs(theSize.y()) + std::abs(theSize.z()); } return anArea; @@ -461,13 +461,13 @@ struct SurfaceCalculator { static T Area(const typename BVH_Box::BVH_VecNt& theSize) { - const T anArea = - (theSize.x() * theSize.y() + theSize.x() * theSize.z() + theSize.z() * theSize.y()) - * static_cast(2.0); + const T anArea = (std::abs(theSize.x() * theSize.y()) + std::abs(theSize.x() * theSize.z()) + + std::abs(theSize.z() * theSize.y())) + * static_cast(2.0); if (anArea < std::numeric_limits::epsilon()) { - return theSize.x() + theSize.y() + theSize.z(); + return std::abs(theSize.x()) + std::abs(theSize.y()) + std::abs(theSize.z()); } return anArea;