Math.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. // Copyright (C) 2009-2021, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <Tests/Framework/Framework.h>
  6. #include "anki/Math.h"
  7. using namespace anki;
  8. /// Test the common perators between a vector and another vector
  9. template<typename Vec>
  10. void operatorsSame()
  11. {
  12. const U size = Vec::COMPONENT_COUNT;
  13. using T = typename Vec::Scalar;
  14. Vec a, b;
  15. Array<T, size> add, sub, mul, div;
  16. for(U i = 0; i < size; i++)
  17. {
  18. T v0 = T(F64(i * 10) / 2.0 + 1.0);
  19. T v1 = T(F64(i * 1000) / 5.123 + 1.0);
  20. a[i] = v0;
  21. b[i] = v1;
  22. add[i] = v0 + v1;
  23. sub[i] = v0 - v1;
  24. mul[i] = v0 * v1;
  25. div[i] = v0 / v1;
  26. }
  27. Vec c = a + b;
  28. Vec d = a - b;
  29. Vec e = a * b;
  30. Vec f = a / b;
  31. for(U i = 0; i < size; i++)
  32. {
  33. ANKI_TEST_EXPECT_EQ(c[i], add[i]);
  34. ANKI_TEST_EXPECT_EQ(d[i], sub[i]);
  35. ANKI_TEST_EXPECT_EQ(e[i], mul[i]);
  36. ANKI_TEST_EXPECT_EQ(f[i], div[i]);
  37. }
  38. c = a;
  39. c += b;
  40. d = a;
  41. d -= b;
  42. e = a;
  43. e *= b;
  44. f = a;
  45. f /= b;
  46. for(U i = 0; i < size; i++)
  47. {
  48. ANKI_TEST_EXPECT_EQ(c[i], add[i]);
  49. ANKI_TEST_EXPECT_EQ(d[i], sub[i]);
  50. ANKI_TEST_EXPECT_EQ(e[i], mul[i]);
  51. ANKI_TEST_EXPECT_EQ(f[i], div[i]);
  52. }
  53. }
  54. /// Test the dot prods
  55. template<typename Vec>
  56. void dot()
  57. {
  58. const U size = Vec::COMPONENT_COUNT;
  59. using T = typename Vec::Scalar;
  60. T res = 0;
  61. Vec vec;
  62. for(U i = 0; i < size; i++)
  63. {
  64. T x = T(i * 666 + 1);
  65. vec[i] = x;
  66. res += x * x;
  67. }
  68. ANKI_TEST_EXPECT_EQ(vec.dot(vec), res);
  69. }
  70. /// Test length and normalization
  71. template<typename Vec>
  72. void length()
  73. {
  74. using T = typename Vec::Scalar;
  75. U size = Vec::COMPONENT_COUNT;
  76. Vec vec;
  77. T res = 0;
  78. for(U i = 0; i < size; i++)
  79. {
  80. T x = T(i * 666);
  81. vec[i] = x;
  82. res += x * x;
  83. }
  84. res = T(sqrt(F32(res)));
  85. ANKI_TEST_EXPECT_EQ(vec.getLength(), res);
  86. if(Vec::IS_INTEGER)
  87. {
  88. ANKI_TEST_EXPECT_EQ(vec.getNormalized(), vec / res);
  89. }
  90. else
  91. {
  92. auto a = vec / res;
  93. auto b = vec.getNormalized();
  94. for(U i = 0; i < size; i++)
  95. {
  96. ANKI_TEST_EXPECT_NEAR(a[i], b[i], 0.0001);
  97. }
  98. }
  99. }
  100. template<typename Vec>
  101. void comparision()
  102. {
  103. U size = Vec::COMPONENT_COUNT;
  104. using Scalar = typename Vec::Scalar;
  105. Vec a, a1, b;
  106. for(U i = 0; i < size; i++)
  107. {
  108. a[i] = Scalar(i * 666);
  109. a1[i] = a[i];
  110. b[i] = a[i] + 1;
  111. }
  112. ANKI_TEST_EXPECT_EQ(a == a1, true);
  113. ANKI_TEST_EXPECT_EQ(a != a1, false);
  114. ANKI_TEST_EXPECT_EQ(a < a1, false);
  115. ANKI_TEST_EXPECT_EQ(a <= a1, true);
  116. ANKI_TEST_EXPECT_EQ(a > a1, false);
  117. ANKI_TEST_EXPECT_EQ(a >= a1, true);
  118. ANKI_TEST_EXPECT_EQ(a == b, false);
  119. ANKI_TEST_EXPECT_EQ(a != b, true);
  120. ANKI_TEST_EXPECT_EQ(a < b, true);
  121. ANKI_TEST_EXPECT_EQ(a <= b, true);
  122. ANKI_TEST_EXPECT_EQ(a > b, false);
  123. ANKI_TEST_EXPECT_EQ(a >= b, false);
  124. }
  125. /// Common vector tests
  126. template<typename Vec>
  127. void commonVecTests()
  128. {
  129. operatorsSame<Vec>();
  130. dot<Vec>();
  131. length<Vec>();
  132. comparision<Vec>();
  133. }
  134. ANKI_TEST(Math, Vec2)
  135. {
  136. commonVecTests<Vec2>();
  137. commonVecTests<IVec2>();
  138. commonVecTests<UVec2>();
  139. }
  140. ANKI_TEST(Math, Vec3)
  141. {
  142. commonVecTests<Vec3>();
  143. commonVecTests<IVec3>();
  144. commonVecTests<UVec3>();
  145. }
  146. ANKI_TEST(Math, Vec4)
  147. {
  148. commonVecTests<Vec4>();
  149. commonVecTests<IVec4>();
  150. commonVecTests<UVec4>();
  151. }
  152. /// Test the common operators between a matrices
  153. template<typename Mat>
  154. void matOperatorsSame()
  155. {
  156. const U size = Mat::SIZE;
  157. using T = typename Mat::Scalar;
  158. Mat a, b;
  159. Array<T, size> add, sub;
  160. for(U i = 0; i < size; i++)
  161. {
  162. T v0 = T(i * 10 / 2);
  163. T v1 = T(F64(i * 1000) / 5.123);
  164. a[i] = v0;
  165. b[i] = v1;
  166. add[i] = v0 + v1;
  167. sub[i] = v0 - v1;
  168. }
  169. Mat c = a + b;
  170. Mat d = a - b;
  171. for(U i = 0; i < size; i++)
  172. {
  173. ANKI_TEST_EXPECT_EQ(c[i], add[i]);
  174. ANKI_TEST_EXPECT_EQ(d[i], sub[i]);
  175. }
  176. c = a;
  177. c += b;
  178. d = a;
  179. d -= b;
  180. for(U i = 0; i < size; i++)
  181. {
  182. ANKI_TEST_EXPECT_EQ(c[i], add[i]);
  183. ANKI_TEST_EXPECT_EQ(d[i], sub[i]);
  184. }
  185. }
  186. /// Get a filled matrix
  187. template<typename Mat>
  188. Mat getNonEmptyMat(typename Mat::Scalar offset = 0)
  189. {
  190. Mat out;
  191. for(U i = 0; i < Mat::SIZE; i++)
  192. {
  193. out[i] = typename Mat::Scalar(i) + offset;
  194. }
  195. return out;
  196. }
  197. /// Some getters setters
  198. template<typename Mat, typename RowVec, typename ColVec>
  199. void matSettersGetters()
  200. {
  201. using T = typename Mat::Scalar;
  202. Mat m(T(0));
  203. m.setRow(1, RowVec(1.0));
  204. ANKI_TEST_EXPECT_EQ(m.getRow(1), RowVec(1.0));
  205. m.setColumn(1, ColVec(2.0));
  206. m.setColumn(2, ColVec(3.0));
  207. ANKI_TEST_EXPECT_EQ(m.getColumn(1), ColVec(2.0));
  208. ANKI_TEST_EXPECT_EQ(m.getColumn(2), ColVec(3.0));
  209. ANKI_TEST_EXPECT_EQ(m.getYAxis(), m.getColumn(1));
  210. }
  211. /// Transpose
  212. template<typename Mat>
  213. void transpose()
  214. {
  215. Mat a = getNonEmptyMat<Mat>();
  216. Mat b = a.getTransposed();
  217. for(U j = 0; j < Mat::ROW_SIZE; j++)
  218. {
  219. for(U i = 0; i < Mat::COLUMN_SIZE; i++)
  220. {
  221. ANKI_TEST_EXPECT_EQ(a(j, i), b(i, j));
  222. }
  223. }
  224. b.transposeRotationPart();
  225. for(U j = 0; j < 3; j++)
  226. {
  227. for(U i = 0; i < 3; i++)
  228. {
  229. ANKI_TEST_EXPECT_EQ(a(j, i), b(j, i));
  230. }
  231. }
  232. }
  233. /// Mat vector multiplication
  234. template<typename Mat, typename VecIn, typename VecOut>
  235. void matVecMul()
  236. {
  237. using T = typename Mat::Scalar;
  238. Mat m = getNonEmptyMat<Mat>();
  239. VecIn v;
  240. for(U i = 0; i < VecIn::SIZE; i++)
  241. {
  242. v[i] = i;
  243. }
  244. VecOut out = m * v;
  245. VecOut out1;
  246. for(U j = 0; j < Mat::ROW_SIZE; j++)
  247. {
  248. T sum = 0;
  249. for(U i = 0; i < Mat::COLUMN_SIZE; i++)
  250. {
  251. sum += m(j, i) * v[j];
  252. }
  253. out1[j] = sum;
  254. }
  255. ANKI_TEST_EXPECT_EQ(out1, out);
  256. }
  257. template<typename Mat, typename RowVec, typename ColVec>
  258. void commonMatTests()
  259. {
  260. matOperatorsSame<Mat>();
  261. matSettersGetters<Mat, RowVec, ColVec>();
  262. }
  263. ANKI_TEST(Math, Mat3)
  264. {
  265. commonMatTests<Mat3, Vec3, Vec3>();
  266. transpose<Mat3>();
  267. // mat*mat
  268. {
  269. Mat3 a = getNonEmptyMat<Mat3>(0);
  270. Mat3 b = getNonEmptyMat<Mat3>(1);
  271. Mat3 c = a * b;
  272. Mat3 d = Mat3(18.000, 21.000, 24.000, 54.000, 66.000, 78.000, 90.000, 111.000, 132.000);
  273. ANKI_TEST_EXPECT_EQ(c, d);
  274. }
  275. // mat*vec
  276. {
  277. Mat3 m = getNonEmptyMat<Mat3>(1.0);
  278. Vec3 v(0.0, 1.0, 2.0);
  279. ANKI_TEST_EXPECT_EQ(m * v, Vec3(8, 17, 26));
  280. }
  281. }
  282. ANKI_TEST(Math, Mat4)
  283. {
  284. commonMatTests<Mat4, Vec4, Vec4>();
  285. transpose<Mat4>();
  286. // mat*mat
  287. {
  288. Mat4 a = getNonEmptyMat<Mat4>(0);
  289. Mat4 b = getNonEmptyMat<Mat4>(1);
  290. Mat4 c = a * b;
  291. Mat4 d = Mat4(62.0, 68.0, 74.0, 80.0, 174.000, 196.000, 218.000, 240.000, 286.000, 324.000, 362.000, 400.000,
  292. 398.000, 452.000, 506.000, 560.000);
  293. ANKI_TEST_EXPECT_EQ(c, d);
  294. }
  295. // mat*vec
  296. {
  297. Mat4 m = getNonEmptyMat<Mat4>(1.0);
  298. Vec4 v(0.0, 1.0, 2.0, 3.0);
  299. ANKI_TEST_EXPECT_EQ(m * v, Vec4(20, 44, 68, 92));
  300. }
  301. }
  302. ANKI_TEST(Math, Mat3x4)
  303. {
  304. commonMatTests<Mat3x4, Vec4, Vec3>();
  305. // combine transforms
  306. {
  307. Mat3x4 a = getNonEmptyMat<Mat3x4>(0);
  308. Mat3x4 b = getNonEmptyMat<Mat3x4>(1);
  309. Mat3x4 c = a.combineTransformations(b);
  310. Mat3x4 d = Mat3x4(23.000, 26.000, 29.000, 35.000, 83.000, 98.000, 113.000, 135.000, 143.000, 170.000, 197.000,
  311. 235.000);
  312. ANKI_TEST_EXPECT_EQ(c, d);
  313. }
  314. // mat*vec
  315. {
  316. Mat3x4 m = getNonEmptyMat<Mat3x4>(1.0);
  317. Vec4 v(0.0, 1.0, 2.0, 3.0);
  318. ANKI_TEST_EXPECT_EQ(m * v, Vec3(20, 44, 68));
  319. }
  320. }