From 951f116f5b9edb0e0a78f647814f1822ce69e2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 4 Aug 2016 10:30:20 +0200 Subject: [PATCH] Math: added RectangularMatrix::flipped{Cols,Rows}(). --- src/Magnum/Math/RectangularMatrix.h | 38 ++++++++++++++- .../Math/Test/RectangularMatrixTest.cpp | 48 +++++++++++++++++++ src/Magnum/Math/Vector.h | 2 + 3 files changed, 86 insertions(+), 2 deletions(-) diff --git a/src/Magnum/Math/RectangularMatrix.h b/src/Magnum/Math/RectangularMatrix.h index 64e1fdab1..1a05db7ac 100644 --- a/src/Magnum/Math/RectangularMatrix.h +++ b/src/Magnum/Math/RectangularMatrix.h @@ -342,10 +342,30 @@ template class RectangularMatrix { /** * @brief Transposed matrix * - * @see @ref row() + * @see @ref row(), @ref flippedCols(), @ref flippedRows() */ RectangularMatrix transposed() const; + /** + * @brief Matrix with flipped cols + * + * The order of columns is reversed. + * @see @ref transposed(), @ref flippedRows(), @ref Vector::flipped() + */ + constexpr RectangularMatrix flippedCols() const { + return flippedColsInternal(typename Implementation::GenerateReverseSequence::Type{}); + } + + /** + * @brief Matrix with flipped rows + * + * The order of rows is reversed. + * @see @ref transposed(), @ref flippedCols(), @ref Vector::flipped() + */ + constexpr RectangularMatrix flippedRows() const { + return flippedRowsInternal(typename Implementation::GenerateSequence::Type{}); + } + /** * @brief Values on diagonal * @@ -382,6 +402,14 @@ template class RectangularMatrix { /* MSVC 2015 can't handle {} here */ template constexpr explicit RectangularMatrix(Implementation::Sequence, U): _data{Vector((static_cast(sequence), U{typename U::Init{}}))...} {} + template constexpr RectangularMatrix flippedColsInternal(Implementation::Sequence) const { + return {(*this)[sequence]...}; + } + + template constexpr RectangularMatrix flippedRowsInternal(Implementation::Sequence) const { + return {(*this)[sequence].flipped()...}; + } + template constexpr Vector diagonalInternal(Implementation::Sequence) const; Vector _data[cols]; @@ -583,7 +611,13 @@ extern template MAGNUM_EXPORT Corrade::Utility::Debug& operator<<(Corrade::Utili } \ __VA_ARGS__ operator/(T number) const { \ return Math::RectangularMatrix::operator/(number); \ - } + } \ + constexpr __VA_ARGS__ flippedCols() const { \ + return Math::RectangularMatrix::flippedCols(); \ + } \ + constexpr __VA_ARGS__ flippedRows() const { \ + return Math::RectangularMatrix::flippedRows(); \ + } \ #define MAGNUM_MATRIX_OPERATOR_IMPLEMENTATION(...) \ template inline __VA_ARGS__ operator*(typename std::common_type::type number, const __VA_ARGS__& matrix) { \ diff --git a/src/Magnum/Math/Test/RectangularMatrixTest.cpp b/src/Magnum/Math/Test/RectangularMatrixTest.cpp index 36a496df4..b782b2f8b 100644 --- a/src/Magnum/Math/Test/RectangularMatrixTest.cpp +++ b/src/Magnum/Math/Test/RectangularMatrixTest.cpp @@ -81,6 +81,8 @@ struct RectangularMatrixTest: Corrade::TestSuite::Tester { void multiplyVector(); void transposed(); + void flippedCols(); + void flippedRows(); void diagonal(); void vector(); @@ -128,6 +130,8 @@ RectangularMatrixTest::RectangularMatrixTest() { &RectangularMatrixTest::multiplyVector, &RectangularMatrixTest::transposed, + &RectangularMatrixTest::flippedCols, + &RectangularMatrixTest::flippedRows, &RectangularMatrixTest::diagonal, &RectangularMatrixTest::vector, @@ -409,6 +413,36 @@ void RectangularMatrixTest::transposed() { CORRADE_COMPARE(original.transposed(), transposed); } +void RectangularMatrixTest::flippedCols() { + constexpr Matrix4x3 original{Vector3{ 0.0f, 1.0f, 3.0f}, + Vector3{ 4.0f, 5.0f, 7.0f}, + Vector3{ 8.0f, 9.0f, 11.0f}, + Vector3{12.0f, 13.0f, 15.0f}}; + constexpr Matrix4x3 flipped = original.flippedCols(); + + Matrix4x3 expectedFlipped{Vector3{12.0f, 13.0f, 15.0f}, + Vector3{ 8.0f, 9.0f, 11.0f}, + Vector3{ 4.0f, 5.0f, 7.0f}, + Vector3{ 0.0f, 1.0f, 3.0f}}; + + CORRADE_COMPARE(flipped, expectedFlipped); +} + +void RectangularMatrixTest::flippedRows() { + constexpr Matrix4x3 original{Vector3{ 0.0f, 1.0f, 3.0f}, + Vector3{ 4.0f, 5.0f, 7.0f}, + Vector3{ 8.0f, 9.0f, 11.0f}, + Vector3{12.0f, 13.0f, 15.0f}}; + constexpr Matrix4x3 flipped = original.flippedRows(); + + Matrix4x3 expectedFlipped{Vector3{ 3.0f, 1.0f, 0.0f}, + Vector3{ 7.0f, 5.0f, 4.0f}, + Vector3{11.0f, 9.0f, 8.0f}, + Vector3{15.0f, 13.0f, 12.0f}}; + + CORRADE_COMPARE(flipped, expectedFlipped); +} + void RectangularMatrixTest::diagonal() { Vector3 diagonal(-1.0f, 5.0f, 11.0f); @@ -500,6 +534,10 @@ void RectangularMatrixTest::subclassTypes() { CORRADE_VERIFY((std::is_same>::value)); CORRADE_VERIFY((std::is_same>::value)); CORRADE_VERIFY((std::is_same()), BasicMat<3, Float>>::value)); + + /* Functions */ + CORRADE_VERIFY((std::is_same::value)); + CORRADE_VERIFY((std::is_same::value)); } void RectangularMatrixTest::subclass() { @@ -560,6 +598,16 @@ void RectangularMatrixTest::subclass() { const Math::Vector<1, Float> i(2.0f); const Math::RectangularMatrix<1, 1, Float> j(3.0f); CORRADE_COMPARE(i*j, (BasicMat<1, Float>(6.0f))); + + /* Functions */ + constexpr Mat2x2 flippedCols = Mat2x2{Vector2{-1.0f, 5.0f}, + Vector2{ 7.0f, -2.0f}}.flippedCols(); + CORRADE_COMPARE(flippedCols, (Mat2x2{Vector2{ 7.0f, -2.0f}, + Vector2{-1.0f, 5.0f}})); + constexpr Mat2x2 flippedRows = Mat2x2{Vector2{-1.0f, 5.0f}, + Vector2{ 7.0f, -2.0f}}.flippedRows(); + CORRADE_COMPARE(flippedRows, (Mat2x2{Vector2{ 5.0f, -1.0f}, + Vector2{-2.0f, 7.0f}})); } void RectangularMatrixTest::debug() { diff --git a/src/Magnum/Math/Vector.h b/src/Magnum/Math/Vector.h index 5c435b826..fb3ffe7db 100644 --- a/src/Magnum/Math/Vector.h +++ b/src/Magnum/Math/Vector.h @@ -540,6 +540,8 @@ template class Vector { * @brief Flipped vector * * Returns the vector with components in reverse order. + * @see @ref RectangularMatrix::flippedCols(), + * @ref RectangularMatrix::flippedRows() */ constexpr Vector flipped() const { return flippedInternal(typename Implementation::GenerateReverseSequence::Type{});