VectorTests.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. #include "../Tests.hpp"
  2. #include "core/Test.hpp"
  3. #include "core/Vector.hpp"
  4. const float eps = 0.0001f;
  5. using V3 = Core::Vector3;
  6. using I3 = Core::IntVector3;
  7. template class Core::Vector<4, float>;
  8. template class Core::Vector<4, int>;
  9. template class Core::Vector<3, float>;
  10. template class Core::Vector<3, int>;
  11. template class Core::Vector<2, float>;
  12. template class Core::Vector<2, int>;
  13. static void testInitAndRead() {
  14. V3 v1;
  15. Core::Vector2 v2(1.0f, 2.0f);
  16. V3 v3(3.0f, 4.0f, 5.0f);
  17. Core::Vector4 v4(6.0f, 7.0f, 8.0f, 9.0f);
  18. TEST_FLOAT(0.0f, v1[0], 0.0f);
  19. TEST_FLOAT(0.0f, v1[0], 0.0f);
  20. TEST_FLOAT(0.0f, v1[0], 0.0f);
  21. TEST_FLOAT(1.0f, v2[0], 0.0f);
  22. TEST_FLOAT(2.0f, v2[1], 0.0f);
  23. TEST_FLOAT(3.0f, v3[0], 0.0f);
  24. TEST_FLOAT(4.0f, v3[1], 0.0f);
  25. TEST_FLOAT(5.0f, v3[2], 0.0f);
  26. TEST_FLOAT(6.0f, v4[0], 0.0f);
  27. TEST_FLOAT(7.0f, v4[1], 0.0f);
  28. TEST_FLOAT(8.0f, v4[2], 0.0f);
  29. TEST_FLOAT(9.0f, v4[3], 0.0f);
  30. }
  31. static V3 angles(float lengthAngle, float widthAngle) {
  32. V3 v;
  33. Core::setAngles(v, lengthAngle, widthAngle);
  34. return v;
  35. }
  36. static void testSetAngles() {
  37. float root = sqrtf(2.0f) * 0.5f;
  38. TEST(V3(1.0f, 0.0f, 0.0f), angles(0.0f, 0.0f));
  39. TEST(V3(root, 0.0f, -root), angles(45.0f, 0.0f));
  40. TEST(V3(0.0f, 0.0f, -1.0f), angles(90.0f, 0.0f));
  41. TEST(V3(-root, 0.0f, -root), angles(135.0f, 0.0f));
  42. TEST(V3(-1.0f, 0.0f, 0.0f), angles(180.0f, 0.0f));
  43. TEST(V3(-root, 0.0f, root), angles(225.0f, 0.0f));
  44. TEST(V3(0.0f, 0.0f, 1.0f), angles(270.0f, 0.0f));
  45. TEST(V3(root, 0.0f, root), angles(315.0f, 0.0f));
  46. TEST(V3(0.0f, 1.0f, 0.0f), angles(0.0f, 90.0f));
  47. TEST(V3(0.0f, 1.0f, 0.0f), angles(90.0f, 90.0f));
  48. TEST(V3(0.0f, 1.0f, 0.0f), angles(180.0f, 90.0f));
  49. TEST(V3(0.0f, 1.0f, 0.0f), angles(270.0f, 90.0f));
  50. TEST(V3(0.0f, -1.0f, 0.0f), angles(0.0f, -90.0f));
  51. TEST(V3(0.0f, -1.0f, 0.0f), angles(90.0f, -90.0f));
  52. TEST(V3(0.0f, -1.0f, 0.0f), angles(180.0f, -90.0f));
  53. TEST(V3(0.0f, -1.0f, 0.0f), angles(270.0f, -90.0f));
  54. TEST(V3(root, root, 0.0f), angles(0.0f, 45.0f));
  55. TEST(V3(0.0f, root, -root), angles(90.0f, 45.0f));
  56. TEST(V3(-root, root, 0.0f), angles(180.0f, 45.0f));
  57. TEST(V3(0.0f, root, root), angles(270.0f, 45.0f));
  58. TEST(V3(root, -root, 0.0f), angles(0.0f, -45.0f));
  59. TEST(V3(0.0f, -root, -root), angles(90.0f, -45.0f));
  60. TEST(V3(-root, -root, 0.0f), angles(180.0f, -45.0f));
  61. TEST(V3(0.0f, -root, root), angles(270.0f, -45.0f));
  62. TEST(V3(0.5f, root, -0.5f), angles(45.0f, 45.0f));
  63. }
  64. static void testCross() {
  65. TEST(V3(0, 0, 1), Core::cross(V3(1, 0, 0), V3(0, 1, 0)));
  66. TEST(V3(0, -1, 0), Core::cross(V3(1, 0, 0), V3(0, 0, 1)));
  67. TEST(V3(0, 0, -1), Core::cross(V3(0, 1, 0), V3(1, 0, 0)));
  68. TEST(V3(1, 0, 0), Core::cross(V3(0, 1, 0), V3(0, 0, 1)));
  69. TEST(V3(0, 1, 0), Core::cross(V3(0, 0, 1), V3(1, 0, 0)));
  70. TEST(V3(-1, 0, 0), Core::cross(V3(0, 0, 1), V3(0, 1, 0)));
  71. }
  72. static void testSetAdd() {
  73. V3 v;
  74. v += V3(1.0f, 2.0f, 3.0f);
  75. TEST(V3(1.0f, 2.0f, 3.0f), v);
  76. v += V3(2.0f, 3.0f, 4.0f);
  77. TEST(V3(3.0f, 5.0f, 7.0f), v);
  78. }
  79. static void testAdd() {
  80. TEST(V3(1.0f, 2.0f, 3.0f), V3() + V3(1.0f, 2.0f, 3.0f));
  81. TEST(V3(3.0f, 5.0f, 7.0f), V3(1.0f, 2.0f, 3.0f) + V3(2.0f, 3.0f, 4.0f));
  82. }
  83. static void testSetSub() {
  84. V3 v;
  85. v -= V3(1.0f, 2.0f, 3.0f);
  86. TEST(V3(-1.0f, -2.0f, -3.0f), v);
  87. v -= V3(2.0f, 3.0f, 4.0f);
  88. TEST(V3(-3.0f, -5.0f, -7.0f), v);
  89. }
  90. static void testSub() {
  91. TEST(V3(1.0f, 2.0f, 3.0f), V3() - V3(-1.0f, -2.0f, -3.0f));
  92. TEST(V3(-1.0f, -1.0f, -1.0f), V3(1.0f, 2.0f, 3.0f) - V3(2.0f, 3.0f, 4.0f));
  93. }
  94. static void testInvert() {
  95. TEST(V3(-1.0f, 2.0f, 3.0f), -V3(1.0f, -2.0f, -3.0f));
  96. }
  97. static void testSetMul() {
  98. V3 v(1.0f, 2.0f, 3.0f);
  99. v *= 3.0f;
  100. TEST(V3(3.0f, 6.0f, 9.0f), v);
  101. v *= -2.0f;
  102. TEST(V3(-6.0f, -12.0f, -18.0f), v);
  103. }
  104. static void testMul() {
  105. TEST(V3(-3.0f, -6.0f, -9.0f), 3.0f * V3(-1.0f, -2.0f, -3.0f));
  106. TEST(V3(3.0f, 6.0f, 9.0f), V3(1.0f, 2.0f, 3.0f) * 3.0);
  107. }
  108. static void testSetMulVector() {
  109. V3 v(1.0f, 2.0f, 3.0f);
  110. v *= V3(2.0f, 1.0f, 3.0f);
  111. TEST(V3(2.0f, 2.0f, 9.0f), v);
  112. v *= V3(-3.0f, 4.0f, -2.0f);
  113. TEST(V3(-6.0f, 8.0f, -18.0f), v);
  114. }
  115. static void testMulVector() {
  116. TEST(
  117. V3(-2.0f, -2.0f, -9.0f),
  118. V3(2.0f, 1.0f, 3.0f) * V3(-1.0f, -2.0f, -3.0f));
  119. TEST(V3(2.0f, 2.0f, 9.0f), V3(1.0f, 2.0f, 3.0f) * V3(2.0f, 1.0f, 3.0f));
  120. }
  121. static void testSetDiv() {
  122. V3 v(12.0f, 24.0f, 9.0f);
  123. v /= 3.0f;
  124. TEST(V3(4.0f, 8.0f, 3.0f), v);
  125. v /= -2.0f;
  126. TEST(V3(-2.0f, -4.0f, -1.5f), v);
  127. }
  128. static void testDiv() {
  129. TEST(V3(-1.0f, -2.0f, -3.0f), V3(-3.0f, -6.0f, -9.0f) / 3.0f);
  130. }
  131. static void testSetDivVector() {
  132. TEST(
  133. V3(-6.0f, -4.0f, -2.0f),
  134. V3(-12.0f, -4.0f, -6.0f) / V3(2.0f, 1.0f, 3.0f));
  135. TEST(
  136. V3(2.0f, -1.0f, 1.0f),
  137. V3(-6.0f, -4.0f, -2.0f) / V3(-3.0f, 4.0f, -2.0f));
  138. }
  139. static void testDivVector() {
  140. TEST(V3(-2, -0.5f, -1), V3(2, 1, 3) / V3(-1, -2, -3));
  141. TEST(V3(0.5f, 2, 1), V3(1, 2, 3) / V3(2, 1, 3));
  142. }
  143. static void testDot() {
  144. TEST_FLOAT(9.0f, V3(-4.0f, 2.0f, -3.0f).dot(V3(-1.0f, -2.0f, -3.0f)), eps);
  145. TEST_FLOAT(-22.0f, V3(2.0f, 2.0f, -4.0f).dot(V3(1.0f, -2.0f, 5.0f)), eps);
  146. }
  147. static void testSquareLength() {
  148. TEST_FLOAT(29.0f, V3(-4.0f, 2.0f, -3.0f).squareLength(), eps);
  149. TEST_FLOAT(24.0f, V3(2.0f, 2.0f, -4.0f).squareLength(), eps);
  150. }
  151. static void testLength() {
  152. TEST_FLOAT(3.0f, V3(-2.0f, 2.0f, -1.0f).length(), eps);
  153. TEST_FLOAT(7.0f, V3(6.0f, 2.0f, -3.0f).length(), eps);
  154. }
  155. static void testNormalize() {
  156. V3 v1(-2.0f, 2.0f, -1.0f);
  157. V3 v2 = v1 * (1.0f / 3.0f);
  158. v1.normalize();
  159. TEST(v2, v1);
  160. V3 v3(6.0f, 2.0f, -3.0f);
  161. V3 v4 = v3 * (1.0f / 7.0f);
  162. v3.normalize();
  163. TEST(v4, v3);
  164. }
  165. static void testCast() {
  166. TEST(V3(-2.5f, 2.6f, 9.0f).toInt(), I3(-2, 2, 9));
  167. TEST(I3(-2.5f, 2.6f, 9.0f).toFloat(), V3(-2.0f, 2.0f, 9.0f));
  168. }
  169. static void testToString() {
  170. char buffer[200];
  171. formatBuffer(
  172. buffer, sizeof(buffer), "# # #", Core::Vector<1, float>(),
  173. Core::Vector2(2.0f, 3.0f), V3(4.0f, 5.0f, 6.0f));
  174. TEST_STRING("[0.00] [2.00, 3.00] [4.00, 5.00, 6.00]", buffer);
  175. }
  176. static void testNormalizeIntVector() {
  177. I3 i(1, 2, 3);
  178. i.normalize();
  179. TEST(I3(0, 0, 1), i);
  180. }
  181. void testVector() {
  182. testInitAndRead();
  183. testSetAngles();
  184. testCross();
  185. testSetAdd();
  186. testAdd();
  187. testSetSub();
  188. testSub();
  189. testInvert();
  190. testSetMul();
  191. testMul();
  192. testSetMulVector();
  193. testMulVector();
  194. testSetDiv();
  195. testDiv();
  196. testSetDivVector();
  197. testDivVector();
  198. testDot();
  199. testSquareLength();
  200. testLength();
  201. testNormalize();
  202. testCast();
  203. testToString();
  204. testNormalizeIntVector();
  205. }