diff --git a/src/Math/Range.h b/src/Math/Range.h index 2df1c2c07..5489c9ff8 100644 --- a/src/Math/Range.h +++ b/src/Math/Range.h @@ -156,6 +156,14 @@ template class Range { */ Range padded(const VectorType& padding) const; + /** + * @brief Scaled range + * + * Multiplies the minimal and maximal coordinates by given amount. + * @see @ref padded() + */ + Range scaled(const VectorType& scaling) const; + private: VectorType _min, _max; }; @@ -170,6 +178,9 @@ template class Range { } \ Type padded(const VectorType& padding) const { \ return Range::padded(padding); \ + } \ + Type scaled(const VectorType& scaling) const { \ + return Range::scaled(scaling); \ } #endif @@ -454,6 +465,10 @@ template Range Range Range Range::scaled(const VectorType& scaling) const { + return {_min*scaling, _max*scaling}; +} + }} namespace Corrade { namespace Utility { diff --git a/src/Math/Test/RangeTest.cpp b/src/Math/Test/RangeTest.cpp index c3b6e660c..2f790bf81 100644 --- a/src/Math/Test/RangeTest.cpp +++ b/src/Math/Test/RangeTest.cpp @@ -51,6 +51,7 @@ class RangeTest: public Corrade::TestSuite::Tester { void translated(); void padded(); + void scaled(); void subclassTypes(); void subclass(); @@ -82,6 +83,7 @@ RangeTest::RangeTest() { &RangeTest::translated, &RangeTest::padded, + &RangeTest::scaled, &RangeTest::subclassTypes, &RangeTest::subclass, @@ -292,6 +294,13 @@ void RangeTest::padded() { CORRADE_COMPARE(a.center(), b.center()); } +void RangeTest::scaled() { + Range2Di a({34, 23}, {47, 30}); + Range2Di b({68, -69}, {94, -90}); + + CORRADE_COMPARE(a.scaled({2, -3}), b); +} + template class BasicRect: public Math::Range<2, T> { public: template BasicRect(U&&... args): Math::Range<2, T>{std::forward(args)...} {} @@ -308,6 +317,7 @@ void RangeTest::subclassTypes() { const Recti r; CORRADE_VERIFY((std::is_same::value)); CORRADE_VERIFY((std::is_same::value)); + CORRADE_VERIFY((std::is_same::value)); } void RangeTest::subclass() { @@ -318,6 +328,8 @@ void RangeTest::subclass() { Recti(Vector2i{17, 63}, Vector2i{30, 70})); CORRADE_COMPARE(Recti(Vector2i{34, 23}, Vector2i{47, 30}).padded({3, -5}), Recti(Vector2i{31, 28}, Vector2i{50, 25})); + CORRADE_COMPARE(Recti(Vector2i{34, 23}, Vector2i{47, 30}).scaled({2, -3}), + Recti(Vector2i{68, -69}, Vector2i{94, -90})); } void RangeTest::debug() {