diff --git a/src/Math/Range.h b/src/Math/Range.h index e2fb51f23..eff56d0a6 100644 --- a/src/Math/Range.h +++ b/src/Math/Range.h @@ -125,10 +125,19 @@ template class Range { * * @see @ref min(), @ref max(), @ref Range2D::sizeX(), * @ref Range2D::sizeY(), @ref Range3D::sizeX(), - * @ref Range3D::sizeY(), @ref Range3D::sizeZ() + * @ref Range3D::sizeY(), @ref Range3D::sizeZ(), @ref center() */ VectorType size() const { return _max - _min; } + /** + * @brief Range center + * + * @see @ref Range2D::centerX(), @ref Range2D::centerY(), + * @ref Range3D::centerX(), @ref Range3D::centerY(), + * @ref Range3D::centerZ(), @ref size() + */ + VectorType center() const { return (_min + _max)/T(2); } + /** * @brief Translated range * @@ -242,6 +251,24 @@ template class Range2D: public Range<2, T> { return Range<2, T>::max().y() - Range<2, T>::min().y(); } + /** + * @brief %Range center on X axis + * + * @see @ref center() + */ + T centerX() const { + return (Range<2, T>::min().x() + Range<2, T>::max().x())/T(2); + } + + /** + * @brief %Range center on Y axis + * + * @see @ref center() + */ + T centerY() const { + return (Range<2, T>::min().y() + Range<2, T>::max().y())/T(2); + } + MAGNUM_RANGE_SUBCLASS_IMPLEMENTATION(2, Range2D, Vector2) }; @@ -362,6 +389,34 @@ template class Range3D: public Range<3, T> { return Range<3, T>::max().z() - Range<3, T>::min().z(); } + /** + * + * @brief %Range center on X axis + * + * @see @ref center() + */ + T centerX() const { + return (Range<3, T>::min().x() + Range<3, T>::max().x())/T(2); + } + + /** + * @brief %Range center on Y axis + * + * @see @ref center() + */ + T centerY() const { + return (Range<3, T>::min().y() + Range<3, T>::max().y())/T(2); + } + + /** + * @brief %Range center on Z axis + * + * @see @ref center() + */ + T centerZ() const { + return (Range<3, T>::min().z() + Range<3, T>::max().z())/T(2); + } + MAGNUM_RANGE_SUBCLASS_IMPLEMENTATION(3, Range3D, Vector3) }; diff --git a/src/Math/Test/RangeTest.cpp b/src/Math/Test/RangeTest.cpp index c0e4caa7a..a6a482071 100644 --- a/src/Math/Test/RangeTest.cpp +++ b/src/Math/Test/RangeTest.cpp @@ -47,6 +47,7 @@ class RangeTest: public Corrade::TestSuite::Tester { void access(); void compare(); void size(); + void center(); void translated(); @@ -76,6 +77,7 @@ RangeTest::RangeTest() { &RangeTest::access, &RangeTest::compare, &RangeTest::size, + &RangeTest::center, &RangeTest::translated, @@ -255,6 +257,23 @@ void RangeTest::size() { CORRADE_COMPARE(cube.sizeZ(), 29); } +void RangeTest::center() { + const Range1Di line(34, 47); + const Range2Di rect({34, 23}, {47, 30}); + const Range3Di cube({34, 23, -17}, {47, 30, 12}); + + CORRADE_COMPARE(line.center(), 40); + CORRADE_COMPARE(rect.center(), Vector2i(40, 26)); + CORRADE_COMPARE(cube.center(), Vector3i(40, 26, -2)); + + CORRADE_COMPARE(rect.centerX(), 40); + CORRADE_COMPARE(rect.centerY(), 26); + + CORRADE_COMPARE(cube.centerX(), 40); + CORRADE_COMPARE(cube.centerY(), 26); + CORRADE_COMPARE(cube.centerZ(), -2); +} + void RangeTest::translated() { Range2Di a({34, 23}, {47, 30}); Range2Di b({17, 63}, {30, 70});