MatrixTests.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. module Tests;
  2. import Core.Matrix;
  3. import Core.Test;
  4. import Core.Vector;
  5. import Core.Math;
  6. import Core.Quaternion;
  7. import Core.ToString;
  8. import Core.Types;
  9. using Core::Matrix;
  10. using V3 = Core::Vector3;
  11. static void testInit() {
  12. Matrix m;
  13. const float* data = m.getValues();
  14. for(int i = 0; i < 16; i++) {
  15. int x = i % 4;
  16. int y = i / 4;
  17. Core::testFloat(x == y, data[i], 0.0f);
  18. }
  19. }
  20. static void testTranspose() {
  21. Matrix m;
  22. m.set(0, Core::Vector4(1.0f, 2.0f, 3.0f, 4.0f));
  23. m.set(1, Core::Vector4(5.0f, 6.0f, 7.0f, 8.0f));
  24. m.set(2, Core::Vector4(9.0f, 10.0f, 11.0f, 12.0f));
  25. m.set(3, Core::Vector4(13.0f, 14.0f, 15.0f, 16.0f));
  26. Matrix t = m.transpose();
  27. Matrix m2 = t.transpose();
  28. const float* mp = m.getValues();
  29. const float* tp = t.getValues();
  30. for(int x = 0; x < 4; x++) {
  31. for(int y = 0; y < 4; y++) {
  32. Core::testFloat(mp[y * 4 + x], tp[x * 4 + y], 0.0f);
  33. }
  34. }
  35. const float* mp2 = m2.getValues();
  36. for(int i = 0; i < 16; i++) {
  37. Core::testFloat(mp[i], mp2[i], 0.0f);
  38. }
  39. }
  40. static void testScale() {
  41. Core::Matrix m;
  42. m.scale(V3(2.0f, 3.0f, 4.0f));
  43. Core::test(V3(-8.0f, 18.0f, 28.0f), m * V3(-4.0f, 6.0f, 7.0f));
  44. }
  45. static void testUniformScale() {
  46. Core::Matrix m;
  47. m.scale(2.0f);
  48. Core::test(V3(-8.0f, 12.0f, 14.0f), m * V3(-4.0f, 6.0f, 7.0f));
  49. }
  50. static void testTranslateX() {
  51. Core::Matrix m;
  52. m.translateX(5.0f);
  53. Core::test(V3(1.0f, 6.0f, 7.0f), m * V3(-4.0f, 6.0f, 7.0f));
  54. }
  55. static void testTranslateY() {
  56. Core::Matrix m;
  57. m.translateY(6.0f);
  58. Core::test(V3(-4.0f, 12.0f, 7.0f), m * V3(-4.0f, 6.0f, 7.0f));
  59. }
  60. static void testTranslateZ() {
  61. Core::Matrix m;
  62. m.translateZ(7.0f);
  63. Core::test(V3(-4.0f, 6.0f, 14.0f), m * V3(-4.0f, 6.0f, 7.0f));
  64. }
  65. static void testTranslate() {
  66. Core::Matrix m;
  67. m.translate(V3(1.0f, 2.0f, 3.0f));
  68. Core::test(V3(-3.0f, 8.0f, 10.0f), m * V3(-4.0f, 6.0f, 7.0f));
  69. }
  70. static void testTranslateTo() {
  71. Matrix m;
  72. m.translateTo(V3(6.0f, 8.0f, 9.0f));
  73. Core::testString(
  74. "[[1.00, 0.00, 0.00, 6.00], [0.00, 1.00, 0.00, 8.00], "
  75. "[0.00, 0.00, 1.00, 9.00], [0.00, 0.00, 0.00, 1.00]]",
  76. m);
  77. }
  78. static void testCombination() {
  79. Matrix m;
  80. m.scale(2.0f);
  81. m.translateX(1.0f);
  82. m.translateY(2.0f);
  83. m.translateZ(3.0f);
  84. m.translate(V3(-4.0f, 2.0f, 3.0f));
  85. m.scale(V3(2.0f, 3.0f, 4.0f));
  86. m.scale(0.5f);
  87. Core::test(V3(-1.0f, 9.0f, 16.0f), m * V3(1.0f, 1.0f, 1.0f));
  88. }
  89. static void testMatrixCombination() {
  90. Matrix a;
  91. a.scale(2.0f);
  92. a.translate(V3(1.0f, 2.0f, 3.0f));
  93. Matrix b;
  94. b.scale(3.0f);
  95. b.translate(V3(1.0f, 1.0f, 1.0f));
  96. Matrix c;
  97. c.translate(V3(-1.0f, -2.0f, -3.0f));
  98. c *= b * a;
  99. Core::test(V3(9.0f, 11.0f, 13.0f), c * V3(1.0f, 1.0f, 1.0f));
  100. }
  101. static void testRotateX() {
  102. Matrix m;
  103. m.rotateX(Core::degreeToRadian(90.0f));
  104. Core::test(V3(1.0f, 0.0f, 0.0f), m * V3(1.0f, 0.0f, 0.0f));
  105. Core::test(V3(0.0f, 0.0f, 1.0f), m * V3(0.0f, 1.0f, 0.0f));
  106. Core::test(V3(0.0f, -1.0f, 0.0f), m * V3(0.0f, 0.0f, 1.0f));
  107. }
  108. static void testRotateY() {
  109. Matrix m;
  110. m.rotateY(Core::degreeToRadian(90.0f));
  111. Core::test(V3(0.0f, 0.0f, -1.0f), m * V3(1.0f, 0.0f, 0.0f));
  112. Core::test(V3(0.0f, 1.0f, 0.0f), m * V3(0.0f, 1.0f, 0.0f));
  113. Core::test(V3(1.0f, 0.0f, 0.0f), m * V3(0.0f, 0.0f, 1.0f));
  114. }
  115. static void testRotateZ() {
  116. Matrix m;
  117. m.rotateZ(Core::degreeToRadian(90.0f));
  118. Core::test(V3(0.0f, 1.0f, 0.0f), m * V3(1.0f, 0.0f, 0.0f));
  119. Core::test(V3(-1.0f, 0.0f, 0.0f), m * V3(0.0f, 1.0f, 0.0f));
  120. Core::test(V3(0.0f, 0.0f, 1.0f), m * V3(0.0f, 0.0f, 1.0f));
  121. }
  122. static void testQuaternionMatrix() {
  123. Core::Quaternion q1(V3(1.0f, 0.0f, 0.0f), Core::degreeToRadian(48.0f));
  124. Core::Quaternion q2(V3(0.0f, 1.0f, 0.0f), Core::degreeToRadian(52.0f));
  125. Core::Quaternion q3(V3(0.0f, 0.0f, 1.0f), Core::degreeToRadian(60.0f));
  126. Matrix m;
  127. m.translate(V3(1.0f, 2.0f, 3.0f));
  128. m.rotate(q1);
  129. m.rotate(q2);
  130. m.rotate(q3);
  131. m.translate(V3(1.0f, 2.0f, 3.0f));
  132. Matrix check;
  133. check.translate(V3(1.0f, 2.0f, 3.0f));
  134. check.rotateX(Core::degreeToRadian(48.0f));
  135. check.rotateY(Core::degreeToRadian(52.0f));
  136. check.rotateZ(Core::degreeToRadian(60.0f));
  137. check.translate(V3(1.0f, 2.0f, 3.0f));
  138. for(int i = 0; i < 16; i++) {
  139. Core::testFloat(check.getValues()[i], m.getValues()[i], 0.0001f);
  140. }
  141. }
  142. static void testToString() {
  143. Matrix m;
  144. m.set(0, Core::Vector4(1.0f, 2.0f, 3.0f, 4.0f));
  145. m.set(1, Core::Vector4(5.0f, 6.0f, 7.0f, 8.0f));
  146. m.set(2, Core::Vector4(9.0f, 10.0f, 11.0f, 12.0f));
  147. m.set(3, Core::Vector4(13.0f, 14.0f, 15.0f, 16.0f));
  148. char buffer[1024];
  149. Core::StringBase s(buffer, sizeof(buffer));
  150. size_t n = s.add(m);
  151. Core::test(111, n);
  152. Core::testString(
  153. "[[1.00, 2.00, 3.00, 4.00], [5.00, 6.00, 7.00, 8.00], "
  154. "[9.00, 10.00, 11.00, 12.00], [13.00, 14.00, 15.00, 16.00]]",
  155. s);
  156. s = Core::StringBase(buffer, 20);
  157. n = s.add(m);
  158. Core::test(111, n);
  159. Core::testString("[[1.00, 2.00, 3.00,", buffer);
  160. }
  161. void testMatrix() {
  162. testInit();
  163. testTranspose();
  164. testScale();
  165. testUniformScale();
  166. testTranslateX();
  167. testTranslateY();
  168. testTranslateZ();
  169. testTranslate();
  170. testTranslateTo();
  171. testCombination();
  172. testMatrixCombination();
  173. testRotateX();
  174. testRotateY();
  175. testRotateZ();
  176. testQuaternionMatrix();
  177. testToString();
  178. }