QuaternionTests.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "../Tests.h"
  2. #include "core/Generic.h"
  3. #define CV3(a, b, c) (&(Vector3){{a, b, c}})
  4. #define CV30 CV3(0.0f, 0.0f, 0.0f)
  5. static void testInit() {
  6. Quaternion q = UNIT_QUATERNION;
  7. char buffer[128];
  8. toStringQ(&q, buffer, sizeof(buffer));
  9. TEST_STRING("(0.000 i + 0.000 j + 0.000 k + 1.000)", buffer);
  10. }
  11. static void testAxisAndDegreesInit() {
  12. Quaternion q = UNIT_QUATERNION;
  13. axisAngleQ(&q, CV3(1.0f, 2.0f, 3.0f), 142.0f);
  14. char buffer[128];
  15. toStringQ(&q, buffer, sizeof(buffer));
  16. TEST_STRING("(0.253 i + 0.505 j + 0.758 k + 0.326)", buffer);
  17. }
  18. static void testLerp() {
  19. Quaternion q1 = UNIT_QUATERNION;
  20. axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 130.0f);
  21. Quaternion q2 = UNIT_QUATERNION;
  22. axisAngleQ(&q2, CV3(1.0f, 2.0f, 4.0f), 260.0f);
  23. Quaternion q3;
  24. lerpQ(&q3, &q1, 0.3f, &q2);
  25. char buffer[128];
  26. toStringQ(&q3, buffer, sizeof(buffer));
  27. TEST_STRING("(0.223 i + 0.529 j + 0.810 k + 0.119)", buffer);
  28. }
  29. static void testMulSet() {
  30. Quaternion q1 = UNIT_QUATERNION;
  31. axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 50.0f);
  32. Quaternion q2 = UNIT_QUATERNION;
  33. axisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), 60.0f);
  34. Quaternion q3 = UNIT_QUATERNION;
  35. mulSet(&q3, &q1);
  36. char bufferQ1[128];
  37. toStringQ(&q1, bufferQ1, sizeof(bufferQ1));
  38. char bufferQ3[128];
  39. toStringQ(&q3, bufferQ3, sizeof(bufferQ3));
  40. TEST_STRING(bufferQ1, bufferQ3);
  41. mulSet(&q3, &q2);
  42. toStringQ(&q3, bufferQ3, sizeof(bufferQ3));
  43. axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 110.0f);
  44. toStringQ(&q1, bufferQ1, sizeof(bufferQ1));
  45. TEST_STRING(bufferQ1, bufferQ3);
  46. }
  47. static void testMul() {
  48. Quaternion q1 = UNIT_QUATERNION;
  49. axisAngleQ(&q1, CV3(2.0f, 5.0f, 7.0f), 50.0f);
  50. Quaternion q2 = UNIT_QUATERNION;
  51. axisAngleQ(&q2, CV3(2.0f, 5.0f, 7.0f), 60.0f);
  52. Quaternion q3 = UNIT_QUATERNION;
  53. mul(&q3, &q1, &q2);
  54. char bufferQ3[128];
  55. toStringQ(&q3, bufferQ3, sizeof(bufferQ3));
  56. Quaternion q = UNIT_QUATERNION;
  57. axisAngleQ(&q, CV3(2.0f, 5.0f, 7.0f), 110.0f);
  58. char bufferQ[128];
  59. toStringQ(&q, bufferQ, sizeof(bufferQ));
  60. TEST_STRING(bufferQ, bufferQ3);
  61. }
  62. static void testMulVector() {
  63. Quaternion q1 = UNIT_QUATERNION;
  64. axisAngleQ(&q1, CV3(1.0f, 0.0f, 0.0f), 90.0f);
  65. Quaternion q2 = UNIT_QUATERNION;
  66. axisAngleQ(&q2, CV3(0.0f, 1.0f, 0.0f), 90.0f);
  67. Quaternion q3 = UNIT_QUATERNION;
  68. axisAngleQ(&q3, CV3(0.0f, 0.0f, 1.0f), 90.0f);
  69. Vector3 v1 = {{1.0f, 0.0f, 0.0f}};
  70. Vector3 v2 = {{0.0f, 1.0f, 0.0f}};
  71. Vector3 v3 = {{0.0f, 0.0f, 1.0f}};
  72. TEST_V3(CV3(1.0f, 0.0f, 0.0f), mul(CV30, &q1, &v1));
  73. TEST_V3(CV3(0.0f, 0.0f, 1.0f), mul(CV30, &q1, &v2));
  74. TEST_V3(CV3(0.0f, -1.0f, 0.0f), mul(CV30, &q1, &v3));
  75. TEST_V3(CV3(0.0f, 0.0f, -1.0f), mul(CV30, &q2, &v1));
  76. TEST_V3(CV3(0.0f, 1.0f, 0.0f), mul(CV30, &q2, &v2));
  77. TEST_V3(CV3(1.0f, 0.0f, 0.0f), mul(CV30, &q2, &v3));
  78. TEST_V3(CV3(0.0f, 1.0f, 0.0f), mul(CV30, &q3, &v1));
  79. TEST_V3(CV3(-1.0f, 0.0f, 0.0f), mul(CV30, &q3, &v2));
  80. TEST_V3(CV3(0.0f, 0.0f, 1.0f), mul(CV30, &q3, &v3));
  81. }
  82. void testQuaternion() {
  83. testInit();
  84. testAxisAndDegreesInit();
  85. testLerp();
  86. testMulSet();
  87. testMul();
  88. testMulVector();
  89. }