Browse Source

Math: added Range*::center*() convenience functions.

pull/34/head
Vladimír Vondruš 13 years ago
parent
commit
9a6c959b60
  1. 57
      src/Math/Range.h
  2. 19
      src/Math/Test/RangeTest.cpp

57
src/Math/Range.h

@ -125,10 +125,19 @@ template<UnsignedInt dimensions, class T> class Range {
* *
* @see @ref min(), @ref max(), @ref Range2D::sizeX(), * @see @ref min(), @ref max(), @ref Range2D::sizeX(),
* @ref Range2D::sizeY(), @ref Range3D::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; } 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 * @brief Translated range
* *
@ -242,6 +251,24 @@ template<class T> class Range2D: public Range<2, T> {
return Range<2, T>::max().y() - Range<2, T>::min().y(); 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) MAGNUM_RANGE_SUBCLASS_IMPLEMENTATION(2, Range2D, Vector2)
}; };
@ -362,6 +389,34 @@ template<class T> class Range3D: public Range<3, T> {
return Range<3, T>::max().z() - Range<3, T>::min().z(); 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) MAGNUM_RANGE_SUBCLASS_IMPLEMENTATION(3, Range3D, Vector3)
}; };

19
src/Math/Test/RangeTest.cpp

@ -47,6 +47,7 @@ class RangeTest: public Corrade::TestSuite::Tester {
void access(); void access();
void compare(); void compare();
void size(); void size();
void center();
void translated(); void translated();
@ -76,6 +77,7 @@ RangeTest::RangeTest() {
&RangeTest::access, &RangeTest::access,
&RangeTest::compare, &RangeTest::compare,
&RangeTest::size, &RangeTest::size,
&RangeTest::center,
&RangeTest::translated, &RangeTest::translated,
@ -255,6 +257,23 @@ void RangeTest::size() {
CORRADE_COMPARE(cube.sizeZ(), 29); 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() { void RangeTest::translated() {
Range2Di a({34, 23}, {47, 30}); Range2Di a({34, 23}, {47, 30});
Range2Di b({17, 63}, {30, 70}); Range2Di b({17, 63}, {30, 70});

Loading…
Cancel
Save