@ -27,6 +27,7 @@
# include <Corrade/TestSuite/Tester.h>
# include "Magnum/Math/Matrix3.h"
# include "Magnum/Math/Matrix4.h"
# include "Magnum/Math/Algorithms/Qr.h"
namespace Magnum { namespace Math { namespace Algorithms { namespace Test {
@ -35,35 +36,54 @@ struct QrTest: Corrade::TestSuite::Tester {
explicit QrTest ( ) ;
void test ( ) ;
void decomposeRotationShear ( ) ;
} ;
typedef Matrix3 < Float > Matrix3 ;
using namespace Math : : Literals ;
typedef Matrix3x3 < Float > Matrix3x3 ;
typedef Vector3 < Float > Vector3 ;
typedef Matrix4 < Float > Matrix4 ;
QrTest : : QrTest ( ) {
addTests ( { & QrTest : : test } ) ;
addTests ( { & QrTest : : test ,
& QrTest : : decomposeRotationShear } ) ;
}
void QrTest : : test ( ) {
Matrix3 a { { 0.0f , 3.0f , 4.0f } ,
{ - 20.0f , 27.0f , 11.0f } ,
{ - 14.0f , - 4.0f , - 2.0f } } ;
Matrix3x3 a { Vector3 { 0.0f , 3.0f , 4.0f } ,
Vector3 { - 20.0f , 27.0f , 11.0f } ,
Vector3 { - 14.0f , - 4.0f , - 2.0f } } ;
Matrix3 q , r ;
Matrix3x3 q , r ;
std : : tie ( q , r ) = Algorithms : : qr ( a ) ;
CORRADE_COMPARE ( q * r , a ) ;
Matrix3 qExpected = Matrix3 { { 0.0f , 15.0f , 20.0f } ,
{ - 20.0f , 12.0f , - 9.0f } ,
{ - 15.0f , - 16.0f , 12.0f } } / 25.0f ;
auto qExpected = Matrix3x3 { Vector3 { 0.0f , 15.0f , 20.0f } ,
Vector3 { - 20.0f , 12.0f , - 9.0f } ,
Vector3 { - 15.0f , - 16.0f , 12.0f } } / 25.0f ;
CORRADE_COMPARE ( q , qExpected ) ;
Matrix3 rExpected { { 5.0f , 0.0f , 0.0f } ,
{ 25.0f , 25.0f , 0.0f } ,
{ - 4.0f , 10.0f , 10.0f } } ;
Matrix3x3 rExpected { Vector3 { 5.0f , 0.0f , 0.0f } ,
Vector3 { 25.0f , 25.0f , 0.0f } ,
Vector3 { - 4.0f , 10.0f , 10.0f } } ;
CORRADE_COMPARE ( r , rExpected ) ;
}
void QrTest : : decomposeRotationShear ( ) {
Matrix4 a = Matrix4 : : scaling ( { 1.5f , 2.0f , 1.0f } ) * Matrix4 : : rotationZ ( 35.0 _degf ) ;
Matrix3x3 q , r ;
std : : tie ( q , r ) = Algorithms : : qr ( a . rotationScaling ( ) ) ;
CORRADE_COMPARE ( q * r , a . rotationScaling ( ) ) ;
auto q4 = Matrix4 : : from ( q , { } ) ;
auto r4 = Matrix4 : : from ( r , { } ) ;
CORRADE_COMPARE ( q4 , Matrix4 : : rotationZ ( 43.03357 _degf ) ) ;
CORRADE_COMPARE ( r4 . scaling ( ) , ( Vector3 { 1.68099f , 1.85048f , 1.0f } ) ) ;
CORRADE_COMPARE ( r4 . rotationShear ( ) , Matrix4 : : shearingXZ ( 0.274077f , 0.0f ) . rotationShear ( ) ) ;
}
} } } }
CORRADE_TEST_MAIN ( Magnum : : Math : : Algorithms : : Test : : QrTest )