Matrix3.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. "use strict";
  2. function Matrix3()
  3. {
  4. this.elements = [
  5. 1, 0, 0,
  6. 0, 1, 0,
  7. 0, 0, 1
  8. ];
  9. }
  10. Object.assign(Matrix3.prototype,
  11. {
  12. isMatrix3: true,
  13. set: function(n11, n12, n13, n21, n22, n23, n31, n32, n33)
  14. {
  15. var te = this.elements;
  16. te[0] = n11;
  17. te[1] = n21;
  18. te[2] = n31;
  19. te[3] = n12;
  20. te[4] = n22;
  21. te[5] = n32;
  22. te[6] = n13;
  23. te[7] = n23;
  24. te[8] = n33;
  25. },
  26. identity: function()
  27. {
  28. this.set(
  29. 1, 0, 0,
  30. 0, 1, 0,
  31. 0, 0, 1
  32. );
  33. },
  34. clone: function()
  35. {
  36. var m = new Matrix3();
  37. m.fromArray(this.elements);
  38. return m;
  39. },
  40. copy: function(m)
  41. {
  42. var te = this.elements;
  43. var me = m.elements;
  44. te[0] = me[0];
  45. te[1] = me[1];
  46. te[2] = me[2];
  47. te[3] = me[3];
  48. te[4] = me[4];
  49. te[5] = me[5];
  50. te[6] = me[6];
  51. te[7] = me[7];
  52. te[8] = me[8];
  53. },
  54. multiply: function(m)
  55. {
  56. return this.multiplyMatrices(this, m);
  57. },
  58. premultiply: function(m)
  59. {
  60. return this.multiplyMatrices(m, this);
  61. },
  62. multiplyMatrices: function(a, b)
  63. {
  64. var ae = a.elements;
  65. var be = b.elements;
  66. var te = this.elements;
  67. var a11 = ae[0],
  68. a12 = ae[3],
  69. a13 = ae[6];
  70. var a21 = ae[1],
  71. a22 = ae[4],
  72. a23 = ae[7];
  73. var a31 = ae[2],
  74. a32 = ae[5],
  75. a33 = ae[8];
  76. var b11 = be[0],
  77. b12 = be[3],
  78. b13 = be[6];
  79. var b21 = be[1],
  80. b22 = be[4],
  81. b23 = be[7];
  82. var b31 = be[2],
  83. b32 = be[5],
  84. b33 = be[8];
  85. te[0] = a11 * b11 + a12 * b21 + a13 * b31;
  86. te[3] = a11 * b12 + a12 * b22 + a13 * b32;
  87. te[6] = a11 * b13 + a12 * b23 + a13 * b33;
  88. te[1] = a21 * b11 + a22 * b21 + a23 * b31;
  89. te[4] = a21 * b12 + a22 * b22 + a23 * b32;
  90. te[7] = a21 * b13 + a22 * b23 + a23 * b33;
  91. te[2] = a31 * b11 + a32 * b21 + a33 * b31;
  92. te[5] = a31 * b12 + a32 * b22 + a33 * b32;
  93. te[8] = a31 * b13 + a32 * b23 + a33 * b33;
  94. },
  95. multiplyScalar: function(s)
  96. {
  97. var te = this.elements;
  98. te[0] *= s;
  99. te[3] *= s;
  100. te[6] *= s;
  101. te[1] *= s;
  102. te[4] *= s;
  103. te[7] *= s;
  104. te[2] *= s;
  105. te[5] *= s;
  106. te[8] *= s;
  107. },
  108. determinant: function()
  109. {
  110. var te = this.elements;
  111. var a = te[0],
  112. b = te[1],
  113. c = te[2],
  114. d = te[3],
  115. e = te[4],
  116. f = te[5],
  117. g = te[6],
  118. h = te[7],
  119. i = te[8];
  120. return a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;
  121. },
  122. getInverse: function(matrix, throwOnDegenerate)
  123. {
  124. var me = matrix.elements,
  125. te = this.elements,
  126. n11 = me[0],
  127. n21 = me[1],
  128. n31 = me[2],
  129. n12 = me[3],
  130. n22 = me[4],
  131. n32 = me[5],
  132. n13 = me[6],
  133. n23 = me[7],
  134. n33 = me[8],
  135. t11 = n33 * n22 - n32 * n23,
  136. t12 = n32 * n13 - n33 * n12,
  137. t13 = n23 * n12 - n22 * n13,
  138. det = n11 * t11 + n21 * t12 + n31 * t13;
  139. if(det === 0)
  140. {
  141. if(throwOnDegenerate === true)
  142. {
  143. throw new Error(".getInverse() cant invert matrix, determinant is 0");
  144. }
  145. return this.identity();
  146. }
  147. var detInv = 1 / det;
  148. te[0] = t11 * detInv;
  149. te[1] = (n31 * n23 - n33 * n21) * detInv;
  150. te[2] = (n32 * n21 - n31 * n22) * detInv;
  151. te[3] = t12 * detInv;
  152. te[4] = (n33 * n11 - n31 * n13) * detInv;
  153. te[5] = (n31 * n12 - n32 * n11) * detInv;
  154. te[6] = t13 * detInv;
  155. te[7] = (n21 * n13 - n23 * n11) * detInv;
  156. te[8] = (n22 * n11 - n21 * n12) * detInv;
  157. },
  158. transpose: function()
  159. {
  160. var tmp, m = this.elements;
  161. tmp = m[1];
  162. m[1] = m[3];
  163. m[3] = tmp;
  164. tmp = m[2];
  165. m[2] = m[6];
  166. m[6] = tmp;
  167. tmp = m[5];
  168. m[5] = m[7];
  169. m[7] = tmp;
  170. },
  171. getNormalMatrix: function(matrix4)
  172. {
  173. return this.setFromMatrix4(matrix4).getInverse(this).transpose();
  174. },
  175. transposeIntoArray: function(r)
  176. {
  177. var m = this.elements;
  178. r[0] = m[0];
  179. r[1] = m[3];
  180. r[2] = m[6];
  181. r[3] = m[1];
  182. r[4] = m[4];
  183. r[5] = m[7];
  184. r[6] = m[2];
  185. r[7] = m[5];
  186. r[8] = m[8];
  187. },
  188. setUvTransform: function(tx, ty, sx, sy, rotation, cx, cy)
  189. {
  190. var c = Math.cos(rotation);
  191. var s = Math.sin(rotation);
  192. this.set(
  193. sx * c, sx * s, -sx * (c * cx + s * cy) + cx + tx,
  194. -sy * s, sy * c, -sy * (-s * cx + c * cy) + cy + ty,
  195. 0, 0, 1
  196. );
  197. },
  198. scale: function(sx, sy)
  199. {
  200. var te = this.elements;
  201. te[0] *= sx;
  202. te[3] *= sx;
  203. te[6] *= sx;
  204. te[1] *= sy;
  205. te[4] *= sy;
  206. te[7] *= sy;
  207. },
  208. rotate: function(theta)
  209. {
  210. var c = Math.cos(theta);
  211. var s = Math.sin(theta);
  212. var te = this.elements;
  213. var a11 = te[0],
  214. a12 = te[3],
  215. a13 = te[6];
  216. var a21 = te[1],
  217. a22 = te[4],
  218. a23 = te[7];
  219. te[0] = c * a11 + s * a21;
  220. te[3] = c * a12 + s * a22;
  221. te[6] = c * a13 + s * a23;
  222. te[1] = -s * a11 + c * a21;
  223. te[4] = -s * a12 + c * a22;
  224. te[7] = -s * a13 + c * a23;
  225. },
  226. translate: function(tx, ty)
  227. {
  228. var te = this.elements;
  229. te[0] += tx * te[2];
  230. te[3] += tx * te[5];
  231. te[6] += tx * te[8];
  232. te[1] += ty * te[2];
  233. te[4] += ty * te[5];
  234. te[7] += ty * te[8];
  235. },
  236. equals: function(matrix)
  237. {
  238. var te = this.elements;
  239. var me = matrix.elements;
  240. for(var i = 0; i < 9; i++)
  241. {
  242. if(te[i] !== me[i]) return false;
  243. }
  244. return true;
  245. },
  246. fromArray: function(array, offset)
  247. {
  248. if(offset === undefined) offset = 0;
  249. for(var i = 0; i < 9; i++)
  250. {
  251. this.elements[i] = array[i + offset];
  252. }
  253. },
  254. toArray: function(array, offset)
  255. {
  256. if(array === undefined) array = [];
  257. if(offset === undefined) offset = 0;
  258. var te = this.elements;
  259. array[offset] = te[0];
  260. array[offset + 1] = te[1];
  261. array[offset + 2] = te[2];
  262. array[offset + 3] = te[3];
  263. array[offset + 4] = te[4];
  264. array[offset + 5] = te[5];
  265. array[offset + 6] = te[6];
  266. array[offset + 7] = te[7];
  267. array[offset + 8] = te[8];
  268. return array;
  269. }
  270. });
  271. export {Matrix3};