QuaternionTest.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzTest/AzTest.h>
  9. #include <NumericalMethods/DoublePrecisionMath/Quaternion.h>
  10. namespace NumericalMethods::DoublePrecisionMath
  11. {
  12. static const float Tolerance = 1e-6f;
  13. TEST(DoublePrecisionMath_Quaternion, Getters)
  14. {
  15. const double x = 0.22;
  16. const double y = 0.26;
  17. const double z = 0.02;
  18. const double w = 0.94;
  19. const Quaternion quaternion(x, y, z, w);
  20. EXPECT_NEAR(quaternion.GetX(), x, Tolerance);
  21. EXPECT_NEAR(quaternion.GetY(), y, Tolerance);
  22. EXPECT_NEAR(quaternion.GetZ(), z, Tolerance);
  23. EXPECT_NEAR(quaternion.GetW(), w, Tolerance);
  24. }
  25. TEST(DoublePrecisionMath_Quaternion, CopyConstructor)
  26. {
  27. const double x = -0.46;
  28. const double y = -0.26;
  29. const double z = 0.58;
  30. const double w = 0.62;
  31. const Quaternion quaternion1(x, y, z, w);
  32. const Quaternion quaternion2(quaternion1);
  33. EXPECT_NEAR(quaternion2.GetX(), x, Tolerance);
  34. EXPECT_NEAR(quaternion2.GetY(), y, Tolerance);
  35. EXPECT_NEAR(quaternion2.GetZ(), z, Tolerance);
  36. EXPECT_NEAR(quaternion2.GetW(), w, Tolerance);
  37. }
  38. TEST(DoublePrecisionMath_Quaternion, FromSingle)
  39. {
  40. const float x = 0.58f;
  41. const float y = -0.22f;
  42. const float z = 0.26f;
  43. const float w = 0.74f;
  44. const AZ::Quaternion quaternionSingle(x, y, z, w);
  45. const Quaternion quaternionDouble(quaternionSingle);
  46. EXPECT_NEAR(quaternionDouble.GetX(), x, Tolerance);
  47. EXPECT_NEAR(quaternionDouble.GetY(), y, Tolerance);
  48. EXPECT_NEAR(quaternionDouble.GetZ(), z, Tolerance);
  49. EXPECT_NEAR(quaternionDouble.GetW(), w, Tolerance);
  50. }
  51. TEST(DoublePrecisionMath_Quaternion, ToSingle)
  52. {
  53. const float x = -0.32f;
  54. const float y = 0.16f;
  55. const float z = -0.16f;
  56. const float w = 0.92f;
  57. const Quaternion quaternionDouble(x, y, z, w);
  58. const AZ::Quaternion quaternionSingle = quaternionDouble.ToSingle();
  59. EXPECT_NEAR(quaternionSingle.GetX(), x, Tolerance);
  60. EXPECT_NEAR(quaternionSingle.GetY(), y, Tolerance);
  61. EXPECT_NEAR(quaternionSingle.GetZ(), z, Tolerance);
  62. EXPECT_NEAR(quaternionSingle.GetW(), w, Tolerance);
  63. }
  64. TEST(DoublePrecisionMath_Quaternion, Multiply)
  65. {
  66. const Quaternion quaternion1(0.1, 0.1, 0.7, 0.7);
  67. const Quaternion quaternion2(0.1, 0.7, 0.7, 0.1);
  68. const Quaternion product = quaternion1 * quaternion2;
  69. EXPECT_NEAR(product.GetX(), -0.34, Tolerance);
  70. EXPECT_NEAR(product.GetY(), 0.5, Tolerance);
  71. EXPECT_NEAR(product.GetZ(), 0.62, Tolerance);
  72. EXPECT_NEAR(product.GetW(), -0.5, Tolerance);
  73. }
  74. TEST(DoublePrecisionMath_Quaternion, Negate)
  75. {
  76. const double x = -0.48;
  77. const double y = 0.24;
  78. const double z = 0.44;
  79. const double w = -0.72;
  80. const Quaternion quaternion1(x, y, z, w);
  81. const Quaternion quaternion2 = -quaternion1;
  82. EXPECT_NEAR(quaternion2.GetX(), -x, Tolerance);
  83. EXPECT_NEAR(quaternion2.GetY(), -y, Tolerance);
  84. EXPECT_NEAR(quaternion2.GetZ(), -z, Tolerance);
  85. EXPECT_NEAR(quaternion2.GetW(), -w, Tolerance);
  86. }
  87. TEST(DoublePrecisionMath_Quaternion, GetNormalized)
  88. {
  89. const double x = 0.22;
  90. const double y = -0.74;
  91. const double z = -0.14;
  92. const double w = 0.62;
  93. const double magnitude = 1.5;
  94. const Quaternion quaternion(magnitude * x, magnitude * y, magnitude * z, magnitude * w);
  95. const Quaternion quaternionNormalized = quaternion.GetNormalized();
  96. EXPECT_NEAR(quaternionNormalized.GetX(), x, Tolerance);
  97. EXPECT_NEAR(quaternionNormalized.GetY(), y, Tolerance);
  98. EXPECT_NEAR(quaternionNormalized.GetZ(), z, Tolerance);
  99. EXPECT_NEAR(quaternionNormalized.GetW(), w, Tolerance);
  100. }
  101. TEST(DoublePrecisionMath_Quaternion, GetConjugate)
  102. {
  103. const double x = 0.16;
  104. const double y = 0.64;
  105. const double z = -0.68;
  106. const double w = 0.32;
  107. const Quaternion quaternion(x, y, z, w);
  108. const Quaternion conjugate = quaternion.GetConjugate();
  109. EXPECT_NEAR(conjugate.GetX(), -x, Tolerance);
  110. EXPECT_NEAR(conjugate.GetY(), -y, Tolerance);
  111. EXPECT_NEAR(conjugate.GetZ(), -z, Tolerance);
  112. EXPECT_NEAR(conjugate.GetW(), w, Tolerance);
  113. }
  114. } // namespace NumericalMethods::DoublePrecisionMath