Math/Box: Add ScaleAroundCenter

This commit is contained in:
SirLynix 2023-05-16 15:43:05 +02:00
parent a6f4e7b08d
commit 741dc6b7e8
3 changed files with 80 additions and 0 deletions

View File

@ -64,6 +64,9 @@ namespace Nz
Box& Scale(T scalar);
Box& Scale(const Vector3<T>& vec);
Box& ScaleAroundCenter(T scalar);
Box& ScaleAroundCenter(const Vector3<T>& vec);
std::string ToString() const;
Box& Transform(const Matrix4<T>& matrix, bool applyTranslation = true);

View File

@ -545,6 +545,46 @@ namespace Nz
return *this;
}
/*!
* \brief Multiplies the lengths of this box with the scalar (the box center doesn't move)
* \return A reference to this box where lengths are the product of these lengths and the scalar
*
* \param scalar The scalar to multiply width, height and depth with
*/
template<typename T>
Box<T>& Box<T>::ScaleAroundCenter(T scalar)
{
x -= (width * scalar - width) / T(2.0);
y -= (height * scalar - height) / T(2.0);
z -= (depth * scalar - depth) / T(2.0);
width *= scalar;
height *= scalar;
depth *= scalar;
return *this;
}
/*!
* \brief Multiplies the lengths of this box with the vector but changes the origin (the box center doesn't move)
* \return A reference to this box where width, height and depth are the product of the old width, height and depth with the vec
*
* \param vec The vector where component one multiply width, two height and three depth
*/
template<typename T>
Box<T>& Box<T>::ScaleAroundCenter(const Vector3<T>& vec)
{
x -= (width * vec.x - width) / T(2.0);
y -= (height * vec.y - height) / T(2.0);
z -= (depth * vec.z - depth) / T(2.0);
width *= vec.x;
height *= vec.y;
depth *= vec.z;
return *this;
}
/*!
* \brief Gives a string representation

View File

@ -89,6 +89,43 @@ SCENARIO("Box", "[MATH][BOX]")
REQUIRE(Nz::Boxf::Lerp(nullBox, centerAndUnit, 0.5f) == result);
}
}
WHEN("We scale the boxes")
{
WHEN("We scale uniformly")
{
firstCenterAndUnit.Scale(2.f);
CHECK(firstCenterAndUnit.GetCenter() == Nz::Vector3f::Unit());
CHECK(firstCenterAndUnit.GetLengths() == 2.f * Nz::Vector3f::Unit());
}
WHEN("We scale non-uniformly")
{
firstCenterAndUnit.Scale({ 2.f, 1.f, 0.01f });
CHECK(firstCenterAndUnit.GetCenter() == Nz::Vector3f(1.f, 0.5f, 0.005f));
CHECK(firstCenterAndUnit.GetLengths() == Nz::Vector3f(2.f, 1.f, 0.01f));
}
WHEN("We scale uniformly around center")
{
Nz::Vector3f center = firstCenterAndUnit.GetCenter();
firstCenterAndUnit.ScaleAroundCenter(2.f);
CHECK(firstCenterAndUnit.GetCenter() == center);
CHECK(firstCenterAndUnit.GetLengths() == 2.f * Nz::Vector3f::Unit());
}
WHEN("We scale non-uniformly around center")
{
Nz::Vector3f center = firstCenterAndUnit.GetCenter();
firstCenterAndUnit.ScaleAroundCenter({ 2.f, 1.f, 0.01f });
CHECK(firstCenterAndUnit.GetCenter() == center);
CHECK(firstCenterAndUnit.GetLengths() == Nz::Vector3f(2.f, 1.f, 0.01f));
}
}
}
GIVEN("Two wrong box (negative width, height and depth")