var Class = require('../../utils/Class'); var TransformMatrix = new Class({ initialize: function TransformMatrix(a, b, c, d, tx, ty){ if (a === undefined) { a = 1; } if (b === undefined) { b = 0; } if (c === undefined) { c = 0; } if (d === undefined) { d = 1; } if (tx === undefined) { tx = 0; } if (ty === undefined) { ty = 0; } this.matrix = new Float32Array([a, b, c, d, tx, ty, 0, 0, 1] ); this.decomposedMatrix = { translateX: 0, translateY: 0, scaleX: 1, scaleY: 1, rotation: 0} ; } , loadIdentity: function (){ var matrix = this.matrix; matrix[0] = 1; matrix[1] = 0; matrix[2] = 0; matrix[3] = 1; matrix[4] = 0; matrix[5] = 0; return this; } , translate: function (x, y){ var matrix = this.matrix; matrix[4] = matrix[0] * x + matrix[2] * y + matrix[4]; matrix[5] = matrix[1] * x + matrix[3] * y + matrix[5]; return this; } , scale: function (x, y){ var matrix = this.matrix; matrix[0] *= x; matrix[1] *= x; matrix[2] *= y; matrix[3] *= y; return this; } , rotate: function (radian){ var radianSin = Math.sin(radian); var radianCos = Math.cos(radian); return this.transform(radianCos, radianSin, - radianSin, radianCos, 0, 0); } , multiply: function (rhs){ var matrix = this.matrix; var otherMatrix = rhs.matrix; var a0 = matrix[0]; var b0 = matrix[1]; var c0 = matrix[2]; var d0 = matrix[3]; var tx0 = matrix[4]; var ty0 = matrix[5]; var a1 = otherMatrix[0]; var b1 = otherMatrix[1]; var c1 = otherMatrix[2]; var d1 = otherMatrix[3]; var tx1 = otherMatrix[4]; var ty1 = otherMatrix[5]; matrix[0] = a1 * a0 + b1 * c0; matrix[1] = a1 * b0 + b1 * d0; matrix[2] = c1 * a0 + d1 * c0; matrix[3] = c1 * b0 + d1 * d0; matrix[4] = tx1 * a0 + ty1 * c0 + tx0; matrix[5] = tx1 * b0 + ty1 * d0 + ty0; return this; } , transform: function (a, b, c, d, tx, ty){ var matrix = this.matrix; var a0 = matrix[0]; var b0 = matrix[1]; var c0 = matrix[2]; var d0 = matrix[3]; var tx0 = matrix[4]; var ty0 = matrix[5]; matrix[0] = a * a0 + b * c0; matrix[1] = a * b0 + b * d0; matrix[2] = c * a0 + d * c0; matrix[3] = c * b0 + d * d0; matrix[4] = tx * a0 + ty * c0 + tx0; matrix[5] = tx * b0 + ty * d0 + ty0; return this; } , transformPoint: function (x, y, point){ if (point === undefined) { point = { x: 0, y: 0} ; } var matrix = this.matrix; var a = matrix[0]; var b = matrix[1]; var c = matrix[2]; var d = matrix[3]; var tx = matrix[4]; var ty = matrix[5]; point.x = x * a + y * c + tx; point.y = x * b + y * d + ty; return point; } , invert: function (){ var matrix = this.matrix; var a = matrix[0]; var b = matrix[1]; var c = matrix[2]; var d = matrix[3]; var tx = matrix[4]; var ty = matrix[5]; var n = a * d - b * c; matrix[0] = d / n; matrix[1] = - b / n; matrix[2] = - c / n; matrix[3] = a / n; matrix[4] = (c * ty - d * tx) / n; matrix[5] = - (a * ty - b * tx) / n; return this; } , setTransform: function (a, b, c, d, tx, ty){ var matrix = this.matrix; matrix[0] = a; matrix[1] = b; matrix[2] = c; matrix[3] = d; matrix[4] = tx; matrix[5] = ty; return this; } , decomposeMatrix: function (){ var decomposedMatrix = this.decomposedMatrix; var matrix = this.matrix; var a = matrix[0]; var b = matrix[1]; var c = matrix[2]; var d = matrix[3]; var a2 = a * a; var b2 = b * b; var c2 = c * c; var d2 = d * d; var sx = Math.sqrt(a2 + c2); var sy = Math.sqrt(b2 + d2); decomposedMatrix.translateX = matrix[4]; decomposedMatrix.translateY = matrix[5]; decomposedMatrix.scaleX = sx; decomposedMatrix.scaleY = sy; decomposedMatrix.rotation = Math.acos(a / sx) * (Math.atan(- c / a) < 0? -1: 1); return decomposedMatrix; } , applyITRS: function (x, y, rotation, scaleX, scaleY){ var matrix = this.matrix; var sr = Math.sin(rotation); var cr = Math.cos(rotation); matrix[4] = x; matrix[5] = y; matrix[0] = cr * scaleX; matrix[1] = - sr * scaleX; matrix[2] = sr * scaleY; matrix[3] = cr * scaleY; return this; } } ); module.exports = TransformMatrix;