diff --git a/doc/changelog.dox b/doc/changelog.dox index abf4f75f2..5389cca0f 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -97,13 +97,15 @@ See also: shortest-path - Added @ref Math::Range2D::x(), @ref Math::Range3D::x(), @ref Math::Range2D::y(), @ref Math::Range3D::y(), @ref Math::Range3D::z() - and @ref Math::Range3D::y() for slicing ranges into lower dimensions + and @ref Math::Range3D::xy() for slicing ranges into lower dimensions - Added @ref Math::intersect() and @ref Math::intersects() as a counterpart to @ref Math::join() for operating with @ref Math::Range instances - Added @ref Math::Range::contains() overloading taking a range, in addition to vector - Added @ref Math::Range::fromCenter() and documented a hint how to create integral centered ranges +- Added @ref Math::Range::scaledFromCenter() as a counterpart to + @ref Math::Range::scaled() - @ref Math::Range is now constructible from a @ref std::pair of values, making it usable in combination with @ref Math::minmax(), for example - Added @ref Math::Constants::piQuarter(), @ref Math::Constants::sqrtHalf() diff --git a/src/Magnum/Math/Range.h b/src/Magnum/Math/Range.h index 52c7c3c7e..c07d04382 100644 --- a/src/Magnum/Math/Range.h +++ b/src/Magnum/Math/Range.h @@ -223,12 +223,25 @@ template class Range { * @brief Scaled range * * Multiplies the minimal and maximal coordinates by given amount. + * Center *doesn't* remain the same, use @ref scaledFromCenter() for + * that operation. * @see @ref padded() */ Range scaled(const VectorType& scaling) const { return {_min*scaling, _max*scaling}; } + /** + * @brief Range scaled from the center + * + * Scales the size, while center remains the same. + * @see @ref scaled(), @ref padded(), @ref fromCenter() + */ + Range scaledFromCenter(const VectorType& scaling) const { + /* Can't use *T(0.5) because that won't work for integers */ + return fromCenter(center(), size()*scaling/T(2)); + } + /** * @brief Whether given point is contained inside the range * diff --git a/src/Magnum/Math/Test/RangeTest.cpp b/src/Magnum/Math/Test/RangeTest.cpp index c7114a0b9..c8f3e0459 100644 --- a/src/Magnum/Math/Test/RangeTest.cpp +++ b/src/Magnum/Math/Test/RangeTest.cpp @@ -116,6 +116,7 @@ struct RangeTest: Corrade::TestSuite::Tester { void translated(); void padded(); void scaled(); + void scaledFromCenter(); void containsVector(); void containsRange(); @@ -158,6 +159,7 @@ RangeTest::RangeTest() { &RangeTest::translated, &RangeTest::padded, &RangeTest::scaled, + &RangeTest::scaledFromCenter, &RangeTest::containsVector, &RangeTest::containsRange, @@ -531,6 +533,16 @@ void RangeTest::scaled() { Range2Di b({68, -69}, {94, -90}); CORRADE_COMPARE(a.scaled({2, -3}), b); + CORRADE_COMPARE((a.size()*Vector2i{2, -3}), b.size()); +} + +void RangeTest::scaledFromCenter() { + Range2Di a{{34, 22}, {48, 30}}; + Range2Di b{{27, 38}, {55, 14}}; + + CORRADE_COMPARE(a.scaledFromCenter({2, -3}), b); + CORRADE_COMPARE(a.center(), b.center()); + CORRADE_COMPARE((a.size()*Vector2i{2, -3}), b.size()); } void RangeTest::containsVector() {