test.pwn 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  1. // generated by "sampctl package generate"
  2. #include "rotation.inc"
  3. #include "rotation_misc.inc"
  4. #define RUN_TESTS
  5. #include <YSI\y_testing>
  6. // Most cases should be tested but no guarantee for completeness
  7. #define EPSILON 0.0002
  8. bool: CheckOrPrintEuler(comment[], Float: x1, Float: y1, Float: z1, Float: x2, Float: y2, Float: z2) {
  9. new
  10. Float: x = x1 - x2,
  11. Float: y = y1 - y2,
  12. Float: z = z1 - z2
  13. ;
  14. while(x >= 360.0) x -= 360.0;
  15. while(y >= 360.0) y -= 360.0;
  16. while(z >= 360.0) z -= 360.0;
  17. while(x <= -EPSILON) x += 360.0;
  18. while(y <= -EPSILON) y += 360.0;
  19. while(z <= -EPSILON) z += 360.0;
  20. return (
  21. -EPSILON < x < EPSILON && -EPSILON < y < EPSILON && -EPSILON < z < EPSILON
  22. ) || printf("%s\n%4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f", comment, x1, y1, z1, x2, y2, z2, x, y, z);
  23. }
  24. bool: CheckOrPrintMatrix(comment[], Float: matrix1[4][4], Float: matrix2[4][4]) {
  25. new
  26. Float: matrix[4][4]
  27. ;
  28. MatrixSub(matrix1, matrix2, matrix);
  29. return (
  30. -EPSILON < matrix[0][0] < EPSILON && -EPSILON < matrix[0][1] < EPSILON && -EPSILON < matrix[0][2] < EPSILON &&
  31. -EPSILON < matrix[1][0] < EPSILON && -EPSILON < matrix[1][1] < EPSILON && -EPSILON < matrix[1][2] < EPSILON &&
  32. -EPSILON < matrix[2][0] < EPSILON && -EPSILON < matrix[2][1] < EPSILON && -EPSILON < matrix[2][2] < EPSILON
  33. ) || printf("%s\n%4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f", comment,
  34. matrix[0][0], matrix[0][1], matrix[0][2],
  35. matrix[1][0], matrix[1][1], matrix[1][2],
  36. matrix[2][0], matrix[2][1], matrix[2][2]
  37. )
  38. ;
  39. }
  40. bool: CheckOrPrintQuat(comment[], Float: w1, Float: x1, Float: y1, Float: z1, Float: w2, Float: x2, Float: y2, Float: z2) {
  41. new
  42. Float: w,
  43. Float: x,
  44. Float: y,
  45. Float: z
  46. ;
  47. if((w1 * w2) < 0.0) {
  48. w = w1 + w2;
  49. x = x1 + x2;
  50. y = y1 + y2;
  51. z = z1 + z2;
  52. } else {
  53. w = w1 - w2;
  54. x = x1 - x2;
  55. y = y1 - y2;
  56. z = z1 - z2;
  57. }
  58. return (
  59. -EPSILON < w < EPSILON && -EPSILON < x < EPSILON && -EPSILON < y < EPSILON && -EPSILON < z < EPSILON
  60. ) || printf("%s\n%4.4f %4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f %4.4f", comment, w1, x1, y1, z1, w2, x2, y2, z2, w, x, y, z);
  61. }
  62. bool: CheckOrPrintAxisAngle(comment[], Float: a1, Float: x1, Float: y1, Float: z1, Float: a2, Float: x2, Float: y2, Float: z2) {
  63. new
  64. Float: a,
  65. Float: x,
  66. Float: y,
  67. Float: z
  68. ;
  69. if((x1 * x2) < 0.0) {
  70. a = 360.0 - a1 - a2;
  71. x = x1 + x2;
  72. y = y1 + y2;
  73. z = z1 + z2;
  74. } else {
  75. a = a1 - a2;
  76. x = x1 - x2;
  77. y = y1 - y2;
  78. z = z1 - z2;
  79. }
  80. return (
  81. -EPSILON < a < EPSILON && -EPSILON < x < EPSILON && -EPSILON < y < EPSILON && -EPSILON < z < EPSILON
  82. ) || printf("%s\n%4.4f %4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f %4.4f\n%4.4f %4.4f %4.4f %4.4f", comment, a1, x1, y1, z1, a2, x2, y2, z2, a, x, y, z);
  83. }
  84. Test:Rotation() {
  85. new
  86. Float: matrix1[4][4],
  87. Float: matrix2[4][4],
  88. Float: rX1 = random(360),
  89. Float: rY1 = random(360),
  90. Float: rZ1 = random(360),
  91. Float: rX2,
  92. Float: rY2,
  93. Float: rZ2,
  94. Float: w1,
  95. Float: x1,
  96. Float: y1,
  97. Float: z1,
  98. Float: w2,
  99. Float: x2,
  100. Float: y2,
  101. Float: z2,
  102. Float: oX = random(500) / 100.0,
  103. Float: oY = random(500) / 100.0,
  104. Float: oZ = random(500) / 100.0,
  105. Float: X1,
  106. Float: Y1,
  107. Float: Z1,
  108. Float: X2,
  109. Float: Y2,
  110. Float: Z2,
  111. Float: pitch1,
  112. Float: roll1,
  113. Float: yaw1,
  114. Float: pitch2,
  115. Float: roll2,
  116. Float: yaw2,
  117. Float: angle1,
  118. Float: aX1,
  119. Float: aY1,
  120. Float: aZ1,
  121. Float: angle2,
  122. Float: aX2,
  123. Float: aY2,
  124. Float: aZ2
  125. ;
  126. GetEulerFromEuler(rX1, rY1, rZ1, euler_samp, rX1, rY1, rZ1); // get calculated values (usually different form random values)
  127. GetRotationMatrixFromEuler(matrix1, rX1, rY1, rZ1);
  128. GetEulerFromMatrix(matrix1, rX2, rY2, rZ2);
  129. GetRotationMatrixFromEuler(matrix2, rX2, rY2, rZ2);
  130. ASSERT(CheckOrPrintEuler("Euler -> Matrix -> Euler", rX1, rY1, rZ1, rX2, rY2, rZ2));
  131. ASSERT(CheckOrPrintMatrix("Matrix -> Euler -> Matrix", matrix1, matrix2));
  132. GetEulerFromMatrix(matrix1, pitch1, roll1, yaw1, euler_zyx);
  133. GetRotationMatrixFromEuler(matrix2, pitch1, roll1, yaw1, euler_zyx);
  134. ASSERT(CheckOrPrintMatrix("Matrix -> Euler (euler_zyx) -> Matrix", matrix1, matrix2));
  135. GetQuatFromMatrix(matrix1, w1, x1, y1, z1);
  136. GetQuatFromEuler(rX1, rY1, rZ1, w2, x2, y2, z2);
  137. ASSERT(CheckOrPrintQuat("Matrix -> Quat | Euler -> Quat", w1, x1, y1, z1, w2, x2, y2, z2));
  138. GetQuatFromEuler(pitch1, roll1, yaw1, w2, x2, y2, z2, euler_zyx);
  139. ASSERT(CheckOrPrintQuat("Matrix -> Quat | Euler (euler_zyx) -> Quat", w1, x1, y1, z1, w2, x2, y2, z2));
  140. GetAxisAngleFromQuat(w1, x1, y1, z1, angle1, aX1, aY1, aZ1);
  141. GetQuatFromAxisAngle(angle1, aX1, aY1, aZ1, w2, x2, y2, z2);
  142. ASSERT(CheckOrPrintQuat("Quat -> Axis Angle -> Quat", w1, x1, y1, z1, w2, x2, y2, z2));
  143. GetRotationMatrixFromQuat(matrix2, w1, x1, y1, z1);
  144. ASSERT(CheckOrPrintMatrix("Matrix -> Quat -> Matrix", matrix1, matrix2));
  145. GetEulerFromQuat(w1, x1, y1, z1, rX2, rY2, rZ2);
  146. ASSERT(CheckOrPrintEuler("Euler -> Quat -> Euler", rX1, rY1, rZ1, rX2, rY2, rZ2));
  147. GetEulerFromEuler(pitch1, roll1, yaw1, euler_zyx, rX2, rY2, rZ2);
  148. ASSERT(CheckOrPrintEuler("Euler -> Matrix -> Euler (euler_zyx) -> Euler", rX1, rY1, rZ1, rX2, rY2, rZ2));
  149. GetEulerFromQuat(w1, x1, y1, z1, pitch2, roll2, yaw2, euler_zyx);
  150. ASSERT(CheckOrPrintEuler("Euler -> Quat -> Euler (euler_zyx)", pitch1, roll1, yaw1, pitch2, roll2, yaw2));
  151. GetEulerFromEuler(rX1, rY1, rZ1, euler_samp, pitch2, roll2, yaw2, euler_zyx);
  152. ASSERT(CheckOrPrintEuler("Euler -> Matrix -> Euler (euler_zyx) | Euler -> Euler (euler_zyx)", pitch1, roll1, yaw1, pitch2, roll2, yaw2));
  153. MatrixRotate(matrix1, oX, oY, oZ, 0.0, X1, Y1, Z1);
  154. EulerRotate(rX1, rY1, rZ1, oX, oY, oZ, X2, Y2, Z2);
  155. ASSERT(CheckOrPrintEuler("MatrixRotate | EulerRotate", X1, Y1, Z1, X2, Y2, Z2));
  156. X2 = Y2 = Z2 = 0.0;
  157. QuatRotate(w1, x1, y1, z1, oX, oY, oZ, X2, Y2, Z2);
  158. ASSERT(CheckOrPrintEuler("MatrixRotate | QuatRotate", X1, Y1, Z1, X2, Y2, Z2));
  159. X2 = Y2 = Z2 = 0.0;
  160. EulerRotate(pitch1, roll1, yaw1, oX, oY, oZ, X2, Y2, Z2, euler_zyx);
  161. ASSERT(CheckOrPrintEuler("MatrixRotate | EulerRotate (euler_zyx)", X1, Y1, Z1, X2, Y2, Z2));
  162. X2 = Y2 = Z2 = 0.0;
  163. AxisAngleRotate(angle1, aX1, aY1, aZ1, oX, oY, oZ, X2, Y2, Z2);
  164. ASSERT(CheckOrPrintEuler("MatrixRotate | AxisAngleRotate", X1, Y1, Z1, X2, Y2, Z2));
  165. GetRotationMatrixFromAxisAngle(matrix2, angle1, aX1, aY1, aZ1);
  166. ASSERT(CheckOrPrintMatrix("Matrix -> Axis Angle -> Matrix", matrix1, matrix2));
  167. GetEulerFromAxisAngle(angle1, aX1, aY1, aZ1, rX2, rY2, rZ2);
  168. ASSERT(CheckOrPrintEuler("Euler -> Matrix -> Quat -> Axis Angle -> Euler", rX1, rY1, rZ1, rX2, rY2, rZ2));
  169. GetAxisAngleFromEuler(rX1, rY1, rZ1, angle2, aX2, aY2, aZ2);
  170. ASSERT(CheckOrPrintAxisAngle("Euler -> Matrix -> Quat -> Axis Angle | Euler -> Axis Angle", angle1, aX1, aY1, aZ1, angle2, aX2, aY2, aZ2));
  171. GetAxisAngleFromMatrix(matrix1, angle2, aX2, aY2, aZ2);
  172. ASSERT(CheckOrPrintAxisAngle("Matrix -> Quat -> Axis Angle | Matirx -> Axis Angle", angle1, aX1, aY1, aZ1, angle2, aX2, aY2, aZ2));
  173. }
  174. Test:EulerTest() {
  175. new
  176. Float: matrix1[4][4],
  177. Float: matrix2[4][4],
  178. Float: matrix3[4][4],
  179. Float: rX = random(360),
  180. Float: rY = random(360),
  181. Float: rZ = random(360);
  182. GetRotMatX(matrix1, rX);
  183. GetRotMatZ(matrix2, rZ);
  184. MatrixMulMatrix(matrix1, matrix2, matrix3);
  185. GetRotMatY(matrix2, rY);
  186. MatrixMulMatrix(matrix3, matrix2, matrix1);
  187. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_xzy);
  188. ASSERT(CheckOrPrintMatrix("euler_xzy", matrix1, matrix2));
  189. GetRotMatX(matrix1, rX);
  190. GetRotMatY(matrix2, rY);
  191. MatrixMulMatrix(matrix1, matrix2, matrix3);
  192. GetRotMatZ(matrix2, rZ);
  193. MatrixMulMatrix(matrix3, matrix2, matrix1);
  194. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_xyz);
  195. ASSERT(CheckOrPrintMatrix("euler_xyz", matrix1, matrix2));
  196. GetRotMatY(matrix1, rY);
  197. GetRotMatX(matrix2, rX);
  198. MatrixMulMatrix(matrix1, matrix2, matrix3);
  199. GetRotMatZ(matrix2, rZ);
  200. MatrixMulMatrix(matrix3, matrix2, matrix1);
  201. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_yxz);
  202. ASSERT(CheckOrPrintMatrix("euler_yxz", matrix1, matrix2));
  203. GetRotMatY(matrix1, rY);
  204. GetRotMatZ(matrix2, rZ);
  205. MatrixMulMatrix(matrix1, matrix2, matrix3);
  206. GetRotMatX(matrix2, rX);
  207. MatrixMulMatrix(matrix3, matrix2, matrix1);
  208. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_yzx);
  209. ASSERT(CheckOrPrintMatrix("euler_yzx", matrix1, matrix2));
  210. GetRotMatZ(matrix1, rZ);
  211. GetRotMatY(matrix2, rY);
  212. MatrixMulMatrix(matrix1, matrix2, matrix3);
  213. GetRotMatX(matrix2, rX);
  214. MatrixMulMatrix(matrix3, matrix2, matrix1);
  215. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_zyx);
  216. ASSERT(CheckOrPrintMatrix("euler_zyx", matrix1, matrix2));
  217. GetRotMatZ(matrix1, rZ);
  218. GetRotMatX(matrix2, rX);
  219. MatrixMulMatrix(matrix1, matrix2, matrix3);
  220. GetRotMatY(matrix2, rY);
  221. MatrixMulMatrix(matrix3, matrix2, matrix1);
  222. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_zxy);
  223. ASSERT(CheckOrPrintMatrix("euler_zxy", matrix1, matrix2));
  224. GetRotMatX(matrix1, rX);
  225. GetRotMatZ(matrix2, rY);
  226. MatrixMulMatrix(matrix1, matrix2, matrix3);
  227. GetRotMatX(matrix2, rZ);
  228. MatrixMulMatrix(matrix3, matrix2, matrix1);
  229. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_xzx);
  230. ASSERT(CheckOrPrintMatrix("euler_xzx", matrix1, matrix2));
  231. GetRotMatX(matrix1, rX);
  232. GetRotMatY(matrix2, rY);
  233. MatrixMulMatrix(matrix1, matrix2, matrix3);
  234. GetRotMatX(matrix2, rZ);
  235. MatrixMulMatrix(matrix3, matrix2, matrix1);
  236. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_xyx);
  237. ASSERT(CheckOrPrintMatrix("euler_xyx", matrix1, matrix2));
  238. GetRotMatY(matrix1, rX);
  239. GetRotMatX(matrix2, rY);
  240. MatrixMulMatrix(matrix1, matrix2, matrix3);
  241. GetRotMatY(matrix2, rZ);
  242. MatrixMulMatrix(matrix3, matrix2, matrix1);
  243. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_yxy);
  244. ASSERT(CheckOrPrintMatrix("euler_yxy", matrix1, matrix2));
  245. GetRotMatY(matrix1, rX);
  246. GetRotMatZ(matrix2, rY);
  247. MatrixMulMatrix(matrix1, matrix2, matrix3);
  248. GetRotMatY(matrix2, rZ);
  249. MatrixMulMatrix(matrix3, matrix2, matrix1);
  250. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_yzy);
  251. ASSERT(CheckOrPrintMatrix("euler_yzy", matrix1, matrix2));
  252. GetRotMatZ(matrix1, rX);
  253. GetRotMatY(matrix2, rY);
  254. MatrixMulMatrix(matrix1, matrix2, matrix3);
  255. GetRotMatZ(matrix2, rZ);
  256. MatrixMulMatrix(matrix3, matrix2, matrix1);
  257. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_zyz);
  258. ASSERT(CheckOrPrintMatrix("euler_zyz", matrix1, matrix2));
  259. GetRotMatZ(matrix1, rX);
  260. GetRotMatX(matrix2, rY);
  261. MatrixMulMatrix(matrix1, matrix2, matrix3);
  262. GetRotMatZ(matrix2, rZ);
  263. MatrixMulMatrix(matrix3, matrix2, matrix1);
  264. GetRotationMatrixFromEuler(matrix2, rX, rY, rZ, euler_zxz);
  265. ASSERT(CheckOrPrintMatrix("euler_zxz", matrix1, matrix2));
  266. }
  267. Test:ConversionTest() {
  268. new
  269. Float: matrix1[4][4],
  270. Float: matrix2[4][4],
  271. Float: rX1 = random(360),
  272. Float: rY1 = random(360),
  273. Float: rZ1 = random(360),
  274. Float: rX2,
  275. Float: rY2,
  276. Float: rZ2,
  277. Float: w1,
  278. Float: x1,
  279. Float: y1,
  280. Float: z1,
  281. Float: w2,
  282. Float: x2,
  283. Float: y2,
  284. Float: z2,
  285. comment[8]
  286. ;
  287. GetRotationMatrixFromEuler(matrix1, rX1, rY1, rZ1);
  288. GetEulerFromMatrix(matrix1, rX1, rY1, rZ1);
  289. GetQuatFromEuler(rX1, rY1, rZ1, w1, x1, y1, z1);
  290. for(new i; i < _: eulermode; ++i) {
  291. valstr(comment[1], i);
  292. GetEulerFromMatrix(matrix1, rX2, rY2, rZ2, eulermode: i);
  293. GetRotationMatrixFromEuler(matrix2, rX2, rY2, rZ2, eulermode: i);
  294. ASSERT(CheckOrPrintMatrix((comment[0] = 'M', comment), matrix1, matrix2));
  295. GetQuatFromEuler(rX2, rY2, rZ2, w2, x2, y2, z2, eulermode: i);
  296. GetEulerFromQuat(w2, x2, y2, z2, rX2, rY2, rZ2);
  297. ASSERT(CheckOrPrintQuat((comment[0] = 'Q', comment), w1, x1, y1, z1, w2, x2, y2, z2));
  298. ASSERT(CheckOrPrintEuler((comment[0] = 'E', comment), rX1, rY1, rZ1, rX2, rY2, rZ2));
  299. }
  300. }