2 * @class Ext.draw.Matrix
5 Ext.define('Ext.draw.Matrix', {
7 /* Begin Definitions */
9 requires: ['Ext.draw.Draw'],
13 constructor: function(a, b, c, d, e, f) {
15 this.matrix = [[a, c, e], [b, d, f], [0, 0, 1]];
18 this.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
22 add: function(a, b, c, d, e, f) {
25 matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
31 for (x = 0; x < 3; x++) {
32 for (y = 0; y < 3; y++) {
34 for (z = 0; z < 3; z++) {
35 res += me.matrix[x][z] * matrix[z][y];
43 prepend: function(a, b, c, d, e, f) {
46 matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
52 for (x = 0; x < 3; x++) {
53 for (y = 0; y < 3; y++) {
55 for (z = 0; z < 3; z++) {
56 res += matrix[x][z] * me.matrix[z][y];
65 var matrix = this.matrix,
73 return new Ext.draw.Matrix(d / x, -b / x, -c / x, a / x, (c * f - d * e) / x, (b * e - a * f) / x);
77 var matrix = this.matrix,
84 return new Ext.draw.Matrix(a, b, c, d, e, f);
87 translate: function(x, y) {
88 this.prepend(1, 0, 0, 1, x, y);
91 scale: function(x, y, cx, cy) {
96 me.add(1, 0, 0, 1, cx, cy);
97 me.add(x, 0, 0, y, 0, 0);
98 me.add(1, 0, 0, 1, -cx, -cy);
101 rotate: function(a, x, y) {
102 a = Ext.draw.Draw.rad(a);
104 cos = +Math.cos(a).toFixed(9),
105 sin = +Math.sin(a).toFixed(9);
106 me.add(cos, sin, -sin, cos, x, y);
107 me.add(1, 0, 0, 1, -x, -y);
111 var matrix = this.matrix;
112 return x * matrix[0][0] + y * matrix[0][1] + matrix[0][2];
116 var matrix = this.matrix;
117 return x * matrix[1][0] + y * matrix[1][1] + matrix[1][2];
120 get: function(i, j) {
121 return + this.matrix[i][j].toFixed(4);
124 toString: function() {
126 return [me.get(0, 0), me.get(0, 1), me.get(1, 0), me.get(1, 1), 0, 0].join();
131 return "matrix(" + [me.get(0, 0), me.get(1, 0), me.get(0, 1), me.get(1, 1), me.get(0, 2), me.get(1, 2)].join() + ")";
134 toFilter: function() {
136 return "progid:DXImageTransform.Microsoft.Matrix(M11=" + me.get(0, 0) +
137 ", M12=" + me.get(0, 1) + ", M21=" + me.get(1, 0) + ", M22=" + me.get(1, 1) +
138 ", Dx=" + me.get(0, 2) + ", Dy=" + me.get(1, 2) + ")";
142 var matrix = this.matrix;
143 return [matrix[0][2].toFixed(4), matrix[1][2].toFixed(4)];
146 // Split matrix into Translate Scale, Shear, and Rotate
149 return a[0] * a[0] + a[1] * a[1];
151 function normalize(a) {
152 var mag = Math.sqrt(norm(a));
156 var matrix = this.matrix,
158 translateX: matrix[0][2],
159 translateY: matrix[1][2]
164 row = [[matrix[0][0], matrix[0][1]], [matrix[1][1], matrix[1][1]]];
165 out.scaleX = Math.sqrt(norm(row[0]));
168 out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];
169 row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];
171 out.scaleY = Math.sqrt(norm(row[1]));
173 out.shear /= out.scaleY;
176 out.rotate = Math.asin(-row[0][1]);
178 out.isSimple = !+out.shear.toFixed(9) && (out.scaleX.toFixed(9) == out.scaleY.toFixed(9) || !out.rotate);