1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-24 13:50:49 +03:00

Compare commits

...

1 Commits

Author SHA1 Message Date
oan
a552a72514 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.
2025-01-30 15:35:15 +00:00

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;