quat.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. /*
  2. * OpenHMD - Free and Open Source API and drivers for immersive technology.
  3. * Copyright (C) 2013 Fredrik Hultin.
  4. * Copyright (C) 2013 Jakob Bornecrantz.
  5. * Distributed under the Boost 1.0 licence, see LICENSE for full text.
  6. */
  7. /* Unit Tests - Quaternion Tests */
  8. #include "tests.h"
  9. static const float t = 0.001;
  10. bool quatf_eq(quatf q1, quatf q2, float t)
  11. {
  12. for(int i = 0; i < 4; i++)
  13. if(!float_eq(q1.arr[i], q2.arr[i], t)){
  14. printf("\nquat.arr[%d] == %f, expected %f\n", i, q1.arr[i], q2.arr[i]);
  15. return false;
  16. }
  17. return true;
  18. }
  19. typedef struct {
  20. vec3f v;
  21. float f;
  22. quatf q;
  23. } vec_float_quat;
  24. void test_oquatf_init_axis()
  25. {
  26. //void oquatf_init_axis(quatf* me, const vec3f* vec, float angle);
  27. vec_float_quat list[] = {
  28. { {{0, 0, 0}}, 0, {{0, 0, 0, 1}}},
  29. { {{5, 12, 3}}, 1, {{0.1796723168488794, 0.43121356043731063, 0.10780339010932766, 0.8775825618903728}}},
  30. { {{-2, -3, 3}}, 1, {{-0.2044277365391809, -0.30664160480877134, 0.30664160480877134, 0.8775825618903728}} },
  31. { {{100, -3, 3}}, -300, {{0.7142339081165469, -0.021427017243496407, 0.021427017243496407, 0.6992508064783751}} },
  32. };
  33. int sz = sizeof(vec_float_quat);
  34. for(int i = 0; i < sizeof(list) / sz; i++){
  35. quatf q;
  36. oquatf_init_axis(&q, &list[i].v, list[i].f);
  37. //printf("%f %f %f %f\n", q.x, q.y, q.z, q.w);
  38. TAssert(quatf_eq(q, list[i].q, t));
  39. }
  40. }
  41. typedef struct {
  42. quatf q;
  43. vec3f v1, v2;
  44. } quat_vec2;
  45. void test_oquatf_get_rotated()
  46. {
  47. // void oquatf_get_rotated(const quatf* me, const vec3f* vec, vec3f* out_vec);
  48. quat_vec2 list[] = {
  49. { {{0, 0, 0, 0}}, {{0, 0, 0}}, {{0, 0, 0}} },
  50. { {{0, 0, 0, 0}}, {{1, 2, 3}}, {{0, 0, 0}} },
  51. { {{0, 0, 0, 1}}, {{1, 2, 3}}, {{1, 2, 3}} },
  52. { {{.4, .2, .1, 1}}, {{2, 1, 0}}, {{2.18, 1.59, 0.2}} },
  53. { {{.4, .2, .1, -1}}, {{2, 1, 0}}, {{2.58, 0.79, 0.2}} },
  54. };
  55. int sz = sizeof(quat_vec2);
  56. for(int i = 0; i < sizeof(list) / sz; i++){
  57. vec3f vec;
  58. oquatf_get_rotated(&list[i].q, &list[i].v1, &vec);
  59. TAssert(vec3f_eq(vec, list[i].v2, t));
  60. }
  61. }
  62. // TODO test_oquatf_mult
  63. void test_oquatf_mult()
  64. {
  65. }
  66. // TODO test_oquatf_normalize
  67. void test_oquatf_normalize()
  68. {
  69. }
  70. // TODO test_oquatf_get_length
  71. void test_oquatf_get_length()
  72. {
  73. }
  74. // TODO test_oquatf_get_mat4x4
  75. void test_oquatf_get_mat4x4()
  76. {
  77. }
  78. typedef struct {
  79. quatf q1, q2;
  80. float f;
  81. } quat2_float;
  82. void test_oquatf_get_dot()
  83. {
  84. // TODO add more test cases
  85. quat2_float list[] = {
  86. { {{1, 2, 3, 1}}, {{4, 3, 2, .5}}, 16.5 },
  87. };
  88. int sz = sizeof(quat2_float);
  89. for(int i = 0; i < sizeof(list) / sz; i++){
  90. TAssert(float_eq(oquatf_get_dot(&list[i].q1, &list[i].q2), list[i].f, t));
  91. }
  92. }
  93. typedef struct {
  94. quatf q1, q2;
  95. } quat2;
  96. void test_oquatf_inverse()
  97. {
  98. // TODO add more test cases
  99. quat2 list[] = {
  100. { {{1, 2, 3, 1}}, {{-0.06666666666666667, -0.13333333333333333, -0.2, 0.06666666666666667}} },
  101. };
  102. int sz = sizeof(quat2);
  103. for(int i = 0; i < sizeof(list) / sz; i++){
  104. oquatf_inverse(&list[i].q1);
  105. TAssert(quatf_eq(list[i].q1, list[i].q2, t));
  106. }
  107. }
  108. typedef struct {
  109. quatf q1, q2, q3;
  110. } quat3;
  111. void test_oquatf_diff()
  112. {
  113. // TODO add more test cases
  114. quat3 list[] = {
  115. { {{1, 2, 3, 1}}, {{5, 3, 2, .1}}, {{0.660000, -0.680000, 0.580000, 1.140000}} },
  116. };
  117. int sz = sizeof(quat3);
  118. for(int i = 0; i < sizeof(list) / sz; i++){
  119. quatf q;
  120. oquatf_diff(&list[i].q1, &list[i].q2, &q);
  121. TAssert(quatf_eq(q, list[i].q3, t));
  122. }
  123. }