File indexing completed on 2024-12-08 09:34:18
0001 // SPDX-License-Identifier: LGPL-2.1-or-later 0002 // 0003 // SPDX-FileCopyrightText: 2011 Bernhard Beschow <bbeschow@cs.tu-berlin.de> 0004 // 0005 0006 #include "Quaternion.h" 0007 #include "MarbleGlobal.h" 0008 #include "TestUtils.h" 0009 0010 #include <QMetaType> 0011 0012 Q_DECLARE_METATYPE( Marble::Quaternion ) 0013 0014 namespace Marble 0015 { 0016 0017 class QuaternionTest : public QObject 0018 { 0019 Q_OBJECT 0020 0021 private Q_SLOTS: 0022 void testEuler_data(); 0023 void testEuler(); 0024 0025 void testSpherical_data(); 0026 void testSpherical(); 0027 }; 0028 0029 void QuaternionTest::testEuler_data() 0030 { 0031 QTest::addColumn<qreal>( "pitch" ); 0032 QTest::addColumn<qreal>( "yaw" ); 0033 QTest::addColumn<qreal>( "roll" ); 0034 0035 addRow() << qreal(0.0) << qreal(0.0) << qreal(0.0); 0036 0037 addRow() << qreal(-180.0) << qreal(0.0) << qreal(0.0); 0038 addRow() << qreal(-90.0) << qreal(0.0) << qreal(0.0); 0039 addRow() << qreal(90.0) << qreal(0.0) << qreal(0.0); 0040 addRow() << qreal(180.0) << qreal(0.0) << qreal(0.0); 0041 0042 addRow() << qreal(-180.0) << qreal(-90.0) << qreal(0.0); 0043 addRow() << qreal(-90.0) << qreal(-90.0) << qreal(0.0); 0044 addRow() << qreal(0.0) << qreal(-90.0) << qreal(0.0); 0045 addRow() << qreal(90.0) << qreal(-90.0) << qreal(0.0); 0046 addRow() << qreal(180.0) << qreal(-90.0) << qreal(0.0); 0047 0048 addRow() << qreal(-180.0) << qreal(90.0) << qreal(0.0); 0049 addRow() << qreal(-90.0) << qreal(90.0) << qreal(0.0); 0050 addRow() << qreal(0.0) << qreal(90.0) << qreal(0.0); 0051 addRow() << qreal(90.0) << qreal(90.0) << qreal(0.0); 0052 addRow() << qreal(180.0) << qreal(90.0) << qreal(0.0); 0053 0054 addRow() << qreal(-180.0) << qreal(0.0) << qreal(90.0); 0055 addRow() << qreal(-90.0) << qreal(0.0) << qreal(90.0); 0056 addRow() << qreal(90.0) << qreal(0.0) << qreal(90.0); 0057 addRow() << qreal(180.0) << qreal(0.0) << qreal(90.0); 0058 0059 addRow() << qreal(-180.0) << qreal(0.0) << qreal(-90.0); 0060 addRow() << qreal(-90.0) << qreal(0.0) << qreal(-90.0); 0061 addRow() << qreal(90.0) << qreal(0.0) << qreal(-90.0); 0062 addRow() << qreal(180.0) << qreal(0.0) << qreal(-90.0); 0063 0064 // 0065 // the following tests currently fail, which should be fixed: 0066 // 0067 0068 // addRow() << qreal(10.0) << qreal(20.0) << qreal(30.0); 0069 0070 // addRow() << qreal(-180.0) << qreal(-89.0) << qreal(90.0); 0071 // addRow() << qreal(-90.0) << qreal(-89.0) << qreal(90.0); 0072 // addRow() << qreal(0.0) << qreal(-89.0) << qreal(90.0); 0073 // addRow() << qreal(90.0) << qreal(-89.0) << qreal(90.0); 0074 // addRow() << qreal(180.0) << qreal(-89.0) << qreal(90.0); 0075 0076 // addRow() << qreal(-180.0) << qreal(89.0) << qreal(90.0); 0077 // addRow() << qreal(-90.0) << qreal(89.0) << qreal(90.0); 0078 // addRow() << qreal(0.0) << qreal(89.0) << qreal(90.0); 0079 // addRow() << qreal(90.0) << qreal(89.0) << qreal(90.0); 0080 // addRow() << qreal(180.0) << qreal(89.0) << qreal(90.0); 0081 0082 // addRow() << qreal(-180.0) << qreal(-89.0) << qreal(-90.0); 0083 // addRow() << qreal(-90.0) << qreal(-89.0) << qreal(-90.0); 0084 // addRow() << qreal(0.0) << qreal(-89.0) << qreal(-90.0); 0085 // addRow() << qreal(90.0) << qreal(-89.0) << qreal(-90.0); 0086 // addRow() << qreal(180.0) << qreal(-89.0) << qreal(-90.0); 0087 0088 // addRow() << qreal(-180.0) << qreal(89.0) << qreal(-90.0); 0089 // addRow() << qreal(-90.0) << qreal(89.0) << qreal(-90.0); 0090 // addRow() << qreal(0.0) << qreal(89.0) << qreal(-90.0); 0091 // addRow() << qreal(90.0) << qreal(89.0) << qreal(-90.0); 0092 // addRow() << qreal(180.0) << qreal(89.0) << qreal(-90.0); 0093 } 0094 0095 void QuaternionTest::testEuler() 0096 { 0097 QFETCH( qreal, pitch ); 0098 QFETCH( qreal, yaw ); 0099 QFETCH( qreal, roll ); 0100 0101 const Quaternion quat = Quaternion::fromEuler( pitch * DEG2RAD, yaw * DEG2RAD, roll * DEG2RAD ); 0102 0103 QFUZZYCOMPARE( quat.pitch() * RAD2DEG, pitch, 0.0000001 ); 0104 QFUZZYCOMPARE( quat.yaw() * RAD2DEG, yaw, 0.0000001 ); 0105 QFUZZYCOMPARE( quat.roll() * RAD2DEG, roll, 0.0000001 ); 0106 } 0107 0108 void QuaternionTest::testSpherical_data() 0109 { 0110 QTest::addColumn<qreal>( "lon" ); 0111 QTest::addColumn<qreal>( "lat" ); 0112 0113 addRow() << qreal(0.0) << qreal(0.0); 0114 0115 addRow() << qreal(-180.0) << qreal(0.0); 0116 addRow() << qreal(-90.0) << qreal(0.0); 0117 addRow() << qreal(90.0) << qreal(0.0); 0118 addRow() << qreal(180.0) << qreal(0.0); 0119 0120 addRow() << qreal(-180.0) << qreal(-89.0); 0121 addRow() << qreal(-90.0) << qreal(-89.0); 0122 addRow() << qreal(0.0) << qreal(-89.0); 0123 addRow() << qreal(90.0) << qreal(-89.0); 0124 addRow() << qreal(180.0) << qreal(-89.0); 0125 0126 addRow() << qreal(-180.0) << qreal(89.0); 0127 addRow() << qreal(-90.0) << qreal(89.0); 0128 addRow() << qreal(0.0) << qreal(89.0); 0129 addRow() << qreal(90.0) << qreal(89.0); 0130 addRow() << qreal(180.0) << qreal(89.0); 0131 0132 // 0133 // the following cases fail, which should be fixed 0134 // 0135 // related bugs: 0136 // bug 285570: animated zooming looks incorrect in globe projection when the earth is upside down 0137 // 0138 0139 // addRow() << qreal(-180.0) << qreal(-179.0); 0140 // addRow() << qreal(-90.0) << qreal(-179.0); 0141 // addRow() << qreal(0.0) << qreal(-179.0); 0142 // addRow() << qreal(90.0) << qreal(-179.0); 0143 // addRow() << qreal(180.0) << qreal(-179.0); 0144 0145 // addRow() << qreal(-180.0) << qreal(179.0); 0146 // addRow() << qreal(-90.0) << qreal(179.0); 0147 // addRow() << qreal(0.0) << qreal(179.0); 0148 // addRow() << qreal(90.0) << qreal(179.0); 0149 // addRow() << qreal(180.0) << qreal(179.0); 0150 } 0151 0152 void QuaternionTest::testSpherical() 0153 { 0154 QFETCH( qreal, lon ); 0155 QFETCH( qreal, lat ); 0156 0157 const Quaternion quat = Quaternion::fromSpherical( lon * DEG2RAD, lat * DEG2RAD ); 0158 0159 qreal _lon, _lat; 0160 quat.getSpherical( _lon, _lat ); 0161 0162 QCOMPARE( _lat * RAD2DEG, lat ); 0163 QCOMPARE( _lon * RAD2DEG, lon ); 0164 } 0165 0166 } 0167 0168 QTEST_MAIN( Marble::QuaternionTest ) 0169 0170 #include "QuaternionTest.moc"