Math.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. // Copyright (C) 2009-2016, 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::SIZE;
  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(i * 10) / 2 + 1;
  19. T v1 = T(i * 1000) / 5.123 + 1;
  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::SIZE;
  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 = 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::SIZE;
  76. Vec vec;
  77. T res = 0;
  78. for(U i = 0; i < size; i++)
  79. {
  80. T x = i * 666;
  81. vec[i] = x;
  82. res += x * x;
  83. }
  84. res = sqrt(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::SIZE;
  104. Vec a, a1, b;
  105. for(U i = 0; i < size; i++)
  106. {
  107. a[i] = i * 666;
  108. a1[i] = a[i];
  109. b[i] = a[i] + 1;
  110. }
  111. ANKI_TEST_EXPECT_EQ(a == a1, true);
  112. ANKI_TEST_EXPECT_EQ(a != a1, false);
  113. ANKI_TEST_EXPECT_EQ(a < a1, false);
  114. ANKI_TEST_EXPECT_EQ(a <= a1, true);
  115. ANKI_TEST_EXPECT_EQ(a > a1, false);
  116. ANKI_TEST_EXPECT_EQ(a >= a1, true);
  117. ANKI_TEST_EXPECT_EQ(a == b, false);
  118. ANKI_TEST_EXPECT_EQ(a != b, true);
  119. ANKI_TEST_EXPECT_EQ(a < b, true);
  120. ANKI_TEST_EXPECT_EQ(a <= b, true);
  121. ANKI_TEST_EXPECT_EQ(a > b, false);
  122. ANKI_TEST_EXPECT_EQ(a >= b, false);
  123. }
  124. /// Common vector tests
  125. template<typename Vec>
  126. void commonVecTests()
  127. {
  128. operatorsSame<Vec>();
  129. dot<Vec>();
  130. length<Vec>();
  131. comparision<Vec>();
  132. }
  133. ANKI_TEST(Math, Vec2)
  134. {
  135. commonVecTests<Vec2>();
  136. commonVecTests<IVec2>();
  137. commonVecTests<UVec2>();
  138. }
  139. ANKI_TEST(Math, Vec3)
  140. {
  141. commonVecTests<Vec3>();
  142. commonVecTests<IVec3>();
  143. commonVecTests<UVec3>();
  144. }
  145. ANKI_TEST(Math, Vec4)
  146. {
  147. commonVecTests<Vec4>();
  148. commonVecTests<IVec4>();
  149. commonVecTests<UVec4>();
  150. }
  151. /// Test the common operators between a matrices
  152. template<typename Mat>
  153. void matOperatorsSame()
  154. {
  155. const U size = Mat::SIZE;
  156. using T = typename Mat::Scalar;
  157. Mat a, b;
  158. Array<T, size> add, sub;
  159. for(U i = 0; i < size; i++)
  160. {
  161. T v0 = T(i * 10) / 2;
  162. T v1 = T(i * 1000) / 5.123;
  163. a[i] = v0;
  164. b[i] = v1;
  165. add[i] = v0 + v1;
  166. sub[i] = v0 - v1;
  167. }
  168. Mat c = a + b;
  169. Mat d = a - b;
  170. for(U i = 0; i < size; i++)
  171. {
  172. ANKI_TEST_EXPECT_EQ(c[i], add[i]);
  173. ANKI_TEST_EXPECT_EQ(d[i], sub[i]);
  174. }
  175. c = a;
  176. c += b;
  177. d = a;
  178. d -= b;
  179. for(U i = 0; i < size; i++)
  180. {
  181. ANKI_TEST_EXPECT_EQ(c[i], add[i]);
  182. ANKI_TEST_EXPECT_EQ(d[i], sub[i]);
  183. }
  184. }
  185. /// Get a filled matrix
  186. template<typename Mat>
  187. Mat getNonEmptyMat(typename Mat::Scalar offset = 0)
  188. {
  189. Mat out;
  190. for(U i = 0; i < Mat::SIZE; i++)
  191. {
  192. out[i] = i + offset;
  193. }
  194. return out;
  195. }
  196. /// Some getters setters
  197. template<typename Mat, typename RowVec, typename ColVec>
  198. void matSettersGetters()
  199. {
  200. using T = typename Mat::Scalar;
  201. Mat m(T(0));
  202. m.setRow(1, RowVec(1.0));
  203. ANKI_TEST_EXPECT_EQ(m.getRow(1), RowVec(1.0));
  204. m.setColumn(1, ColVec(2.0));
  205. m.setColumn(2, ColVec(3.0));
  206. ANKI_TEST_EXPECT_EQ(m.getColumn(1), ColVec(2.0));
  207. ANKI_TEST_EXPECT_EQ(m.getColumn(2), ColVec(3.0));
  208. ANKI_TEST_EXPECT_EQ(m.getYAxis(), m.getColumn(1));
  209. }
  210. /// Transpose
  211. template<typename Mat>
  212. void transpose()
  213. {
  214. Mat a = getNonEmptyMat<Mat>();
  215. Mat b = a.getTransposed();
  216. for(U j = 0; j < Mat::ROW_SIZE; j++)
  217. {
  218. for(U i = 0; i < Mat::COLUMN_SIZE; i++)
  219. {
  220. ANKI_TEST_EXPECT_EQ(a(j, i), b(i, j));
  221. }
  222. }
  223. b.transposeRotationPart();
  224. for(U j = 0; j < 3; j++)
  225. {
  226. for(U i = 0; i < 3; i++)
  227. {
  228. ANKI_TEST_EXPECT_EQ(a(j, i), b(j, i));
  229. }
  230. }
  231. }
  232. /// Mat vector multiplication
  233. template<typename Mat, typename VecIn, typename VecOut>
  234. void matVecMul()
  235. {
  236. using T = typename Mat::Scalar;
  237. Mat m = getNonEmptyMat<Mat>();
  238. VecIn v;
  239. for(U i = 0; i < VecIn::SIZE; i++)
  240. {
  241. v[i] = i;
  242. }
  243. VecOut out = m * v;
  244. VecOut out1;
  245. for(U j = 0; j < Mat::ROW_SIZE; j++)
  246. {
  247. T sum = 0;
  248. for(U i = 0; i < Mat::COLUMN_SIZE; i++)
  249. {
  250. sum += m(j, i) * v[j];
  251. }
  252. out1[j] = sum;
  253. }
  254. ANKI_TEST_EXPECT_EQ(out1, out);
  255. }
  256. template<typename Mat, typename RowVec, typename ColVec>
  257. void commonMatTests()
  258. {
  259. matOperatorsSame<Mat>();
  260. matSettersGetters<Mat, RowVec, ColVec>();
  261. }
  262. ANKI_TEST(Math, Mat3)
  263. {
  264. commonMatTests<Mat3, Vec3, Vec3>();
  265. transpose<Mat3>();
  266. // mat*mat
  267. {
  268. Mat3 a = getNonEmptyMat<Mat3>(0);
  269. Mat3 b = getNonEmptyMat<Mat3>(1);
  270. Mat3 c = a * b;
  271. Mat3 d = Mat3(18.000, 21.000, 24.000, 54.000, 66.000, 78.000, 90.000, 111.000, 132.000);
  272. ANKI_TEST_EXPECT_EQ(c, d);
  273. }
  274. // mat*vec
  275. {
  276. Mat3 m = getNonEmptyMat<Mat3>(1.0);
  277. Vec3 v(0.0, 1.0, 2.0);
  278. ANKI_TEST_EXPECT_EQ(m * v, Vec3(8, 17, 26));
  279. }
  280. }
  281. ANKI_TEST(Math, Mat4)
  282. {
  283. commonMatTests<Mat4, Vec4, Vec4>();
  284. transpose<Mat4>();
  285. // mat*mat
  286. {
  287. Mat4 a = getNonEmptyMat<Mat4>(0);
  288. Mat4 b = getNonEmptyMat<Mat4>(1);
  289. Mat4 c = a * b;
  290. Mat4 d = Mat4(62.0,
  291. 68.0,
  292. 74.0,
  293. 80.0,
  294. 174.000,
  295. 196.000,
  296. 218.000,
  297. 240.000,
  298. 286.000,
  299. 324.000,
  300. 362.000,
  301. 400.000,
  302. 398.000,
  303. 452.000,
  304. 506.000,
  305. 560.000);
  306. ANKI_TEST_EXPECT_EQ(c, d);
  307. }
  308. // mat*vec
  309. {
  310. Mat4 m = getNonEmptyMat<Mat4>(1.0);
  311. Vec4 v(0.0, 1.0, 2.0, 3.0);
  312. ANKI_TEST_EXPECT_EQ(m * v, Vec4(20, 44, 68, 92));
  313. }
  314. }
  315. ANKI_TEST(Math, Mat3x4)
  316. {
  317. commonMatTests<Mat3x4, Vec4, Vec3>();
  318. // combine transforms
  319. {
  320. Mat3x4 a = getNonEmptyMat<Mat3x4>(0);
  321. Mat3x4 b = getNonEmptyMat<Mat3x4>(1);
  322. Mat3x4 c = a.combineTransformations(b);
  323. Mat3x4 d = Mat3x4(
  324. 23.000, 26.000, 29.000, 35.000, 83.000, 98.000, 113.000, 135.000, 143.000, 170.000, 197.000, 235.000);
  325. ANKI_TEST_EXPECT_EQ(c, d);
  326. }
  327. // mat*vec
  328. {
  329. Mat3x4 m = getNonEmptyMat<Mat3x4>(1.0);
  330. Vec4 v(0.0, 1.0, 2.0, 3.0);
  331. ANKI_TEST_EXPECT_EQ(m * v, Vec3(20, 44, 68));
  332. }
  333. }