Matrix3.js 5.3 KB

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