Source: math/Matrix33.js

  1. /**
  2. * @class Matrix33
  3. * @memberof SQR
  4. *
  5. * @description A 3x3 matrix for used to hold rotations and normal matrices
  6. */
  7. SQR.Matrix33 = function() {
  8. this.data = new Float32Array(9);
  9. this.identity = function() {
  10. var d = this.data;
  11. d[0] = 1,d[3] = 0,d[6] = 0;
  12. d[1] = 0,d[4] = 1,d[7] = 0;
  13. d[2] = 0,d[5] = 0,d[8] = 1;
  14. return this;
  15. }
  16. this.copyTo = function(m) {
  17. var a = this.data, b = m.data || m;
  18. for (var i = 0; i < 9; i++) b[i] = a[i];
  19. return this;
  20. }
  21. this.copyFrom = function(m) {
  22. var a = this.data, b = m.data || m;
  23. for (var i = 0; i < 9; i++) a[i] = b[i];
  24. return this;
  25. }
  26. this.transformVector = function (v, pv) {
  27. var d = this.data;
  28. var x = v.x, y = v.y, z = v.z;
  29. pv = pv || v;
  30. pv.x = d[0] * x + d[3] * y + d[6] * z;
  31. pv.y = d[1] * x + d[4] * y + d[7] * z;
  32. pv.z = d[2] * x + d[5] * y + d[8] * z;
  33. return pv;
  34. }
  35. this.determinant = function() {
  36. var d = this.data;
  37. return d[0] * (d[4] * d[8] - d[7] * d[5]) +
  38. d[3] * (d[7] * d[2] - d[1] * d[8]) +
  39. d[6] * (d[1] * d[5] - d[4] * d[2]);
  40. }
  41. this.inverse = function(m) {
  42. var d = this.data;
  43. m = m || this.data;
  44. var a00 = d[0], a01 = d[1], a02 = d[2],
  45. a10 = d[3], a11 = d[4], a12 = d[5],
  46. a20 = d[6], a21 = d[7], a22 = d[8],
  47. b01 = a22 * a11 - a12 * a21,
  48. b11 = -a22 * a10 + a12 * a20,
  49. b21 = a21 * a10 - a11 * a20,
  50. d = a00 * b01 + a01 * b11 + a02 * b21,
  51. id;
  52. if (!d) {
  53. console.warn("Attempt to inverse a singular matrix33. ", this.data);
  54. return m;
  55. }
  56. id = 1 / d;
  57. m[0] = b01 * id;
  58. m[1] = (-a22 * a01 + a02 * a21) * id;
  59. m[2] = (a12 * a01 - a02 * a11) * id;
  60. m[3] = b11 * id;
  61. m[4] = (a22 * a00 - a02 * a20) * id;
  62. m[5] = (-a12 * a00 + a02 * a10) * id;
  63. m[6] = b21 * id;
  64. m[7] = (-a21 * a00 + a01 * a20) * id;
  65. m[8] = (a11 * a00 - a01 * a10) * id;
  66. return m;
  67. }
  68. this.transpose = function() {
  69. var d = this.data;
  70. var d0 = d[0], d3 = d[3], d6 = d[6],
  71. d1 = d[1], d4 = d[4], d7 = d[7],
  72. d2 = d[2], d5 = d[5], d8 = d[8];
  73. d[0] = d0;
  74. d[1] = d3;
  75. d[2] = d6;
  76. d[3] = d1;
  77. d[4] = d4;
  78. d[5] = d7;
  79. d[6] = d2;
  80. d[7] = d5;
  81. d[8] = d8;
  82. }
  83. }