1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-01 17:36:21 +03:00

0033866: Foundation Classes - 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.
This commit is contained in:
oan 2025-01-30 15:35:15 +00:00
parent bef42e89ef
commit a552a72514

View File

@ -427,11 +427,11 @@ struct SurfaceCalculator<T, 2>
{
static T Area(const typename BVH_Box<T, 2>::BVH_VecNt& theSize)
{
const T anArea = theSize.x() * theSize.y();
const T anArea = std::abs (theSize.x() * theSize.y());
if (anArea < std::numeric_limits<T>::epsilon())
{
return theSize.x() + theSize.y();
return std::abs (theSize.x()) + std::abs (theSize.y());
}
return anArea;
@ -444,12 +444,14 @@ struct SurfaceCalculator<T, 3>
static T Area(const typename BVH_Box<T, 3>::BVH_VecNt& theSize)
{
const T anArea =
(theSize.x() * theSize.y() + theSize.x() * theSize.z() + theSize.z() * theSize.y())
(std::abs (theSize.x() * theSize.y()) +
std::abs (theSize.x() * theSize.z()) +
std::abs (theSize.z() * theSize.y()))
* static_cast<T>(2.0);
if (anArea < std::numeric_limits<T>::epsilon())
{
return theSize.x() + theSize.y() + theSize.z();
return std::abs (theSize.x()) + std::abs (theSize.y()) + std::abs (theSize.z());
}
return anArea;
@ -462,12 +464,14 @@ struct SurfaceCalculator<T, 4>
static T Area(const typename BVH_Box<T, 4>::BVH_VecNt& theSize)
{
const T anArea =
(theSize.x() * theSize.y() + theSize.x() * theSize.z() + theSize.z() * theSize.y())
(std::abs (theSize.x() * theSize.y()) +
std::abs (theSize.x() * theSize.z()) +
std::abs (theSize.z() * theSize.y()))
* static_cast<T>(2.0);
if (anArea < std::numeric_limits<T>::epsilon())
{
return theSize.x() + theSize.y() + theSize.z();
return std::abs (theSize.x()) + std::abs (theSize.y()) + std::abs (theSize.z());
}
return anArea;