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"