diff --git a/src/Math/Matrix.h b/src/Math/Matrix.h index dac128d36..c74f37e68 100644 --- a/src/Math/Matrix.h +++ b/src/Math/Matrix.h @@ -143,6 +143,19 @@ template class Matrix { return out; } + /** @brief Matrix without given row and column */ + Matrix ij(size_t skipRow, size_t skipCol) const { + Matrix out(false); + + for(size_t row = 0; row != size-1; ++row) { + for(size_t col = 0; col != size-1; ++col) + out.set(row, col, at(row + (row >= skipRow), + col + (col >= skipCol))); + } + + return out; + } + private: T _data[size*size]; }; diff --git a/src/Math/Test/MatrixTest.cpp b/src/Math/Test/MatrixTest.cpp index b9ce6e866..bf6463ae2 100644 --- a/src/Math/Test/MatrixTest.cpp +++ b/src/Math/Test/MatrixTest.cpp @@ -24,6 +24,7 @@ QTEST_APPLESS_MAIN(Magnum::Math::Test::MatrixTest) namespace Magnum { namespace Math { namespace Test { typedef Matrix Matrix4; +typedef Matrix Matrix3; void MatrixTest::constructIdentity() { Matrix4 identity; @@ -171,4 +172,21 @@ void MatrixTest::transposed() { QVERIFY(Matrix4(original).transposed() == Matrix4(transposed)); } +void MatrixTest::ij() { + float original[] = { + 0.0f, 1.0f, 2.0f, 3.0f, + 4.0f, 5.0f, 6.0f, 7.0f, + 8.0f, 9.0f, 10.0f, 11.0f, + 12.0f, 13.0f, 14.0f, 15.0f + }; + + float skipped[] = { + 0.0f, 1.0f, 3.0f, + 8.0f, 9.0f, 11.0f, + 12.0f, 13.0f, 15.0f + }; + + QVERIFY(Matrix4(original).ij(2, 1) == Matrix3(skipped)); +} + }}} diff --git a/src/Math/Test/MatrixTest.h b/src/Math/Test/MatrixTest.h index e5433d78d..28bab0ab4 100644 --- a/src/Math/Test/MatrixTest.h +++ b/src/Math/Test/MatrixTest.h @@ -31,6 +31,7 @@ class MatrixTest: public QObject { void multiply(); void multiplyVector(); void transposed(); + void ij(); }; }}}