Upgrade to ExtJS 4.0.7 - Released 10/19/2011
[extjs.git] / docs / source / Matrix.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5   <title>The source code</title>
6   <link href="../resources/prettify/prettify.css" type="text/css" rel="stylesheet" />
7   <script type="text/javascript" src="../resources/prettify/prettify.js"></script>
8   <style type="text/css">
9     .highlight { display: block; background-color: #ddd; }
10   </style>
11   <script type="text/javascript">
12     function highlight() {
13       document.getElementById(location.hash.replace(/#/, "")).className = "highlight";
14     }
15   </script>
16 </head>
17 <body onload="prettyPrint(); highlight();">
18   <pre class="prettyprint lang-js">/*
19  * @class Ext.draw.Matrix
20  * @private
21  */
22 Ext.define('Ext.draw.Matrix', {
23
24     /* Begin Definitions */
25
26     requires: ['Ext.draw.Draw'],
27
28     /* End Definitions */
29
30     constructor: function(a, b, c, d, e, f) {
31         if (a != null) {
32             this.matrix = [[a, c, e], [b, d, f], [0, 0, 1]];
33         }
34         else {
35             this.matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
36         }
37     },
38
39     add: function(a, b, c, d, e, f) {
40         var me = this,
41             out = [[], [], []],
42             matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
43             x,
44             y,
45             z,
46             res;
47
48         for (x = 0; x &lt; 3; x++) {
49             for (y = 0; y &lt; 3; y++) {
50                 res = 0;
51                 for (z = 0; z &lt; 3; z++) {
52                     res += me.matrix[x][z] * matrix[z][y];
53                 }
54                 out[x][y] = res;
55             }
56         }
57         me.matrix = out;
58     },
59
60     prepend: function(a, b, c, d, e, f) {
61         var me = this,
62             out = [[], [], []],
63             matrix = [[a, c, e], [b, d, f], [0, 0, 1]],
64             x,
65             y,
66             z,
67             res;
68
69         for (x = 0; x &lt; 3; x++) {
70             for (y = 0; y &lt; 3; y++) {
71                 res = 0;
72                 for (z = 0; z &lt; 3; z++) {
73                     res += matrix[x][z] * me.matrix[z][y];
74                 }
75                 out[x][y] = res;
76             }
77         }
78         me.matrix = out;
79     },
80
81     invert: function() {
82         var matrix = this.matrix,
83             a = matrix[0][0],
84             b = matrix[1][0],
85             c = matrix[0][1],
86             d = matrix[1][1],
87             e = matrix[0][2],
88             f = matrix[1][2],
89             x = a * d - b * c;
90         return new Ext.draw.Matrix(d / x, -b / x, -c / x, a / x, (c * f - d * e) / x, (b * e - a * f) / x);
91     },
92
93     clone: function() {
94         var matrix = this.matrix,
95             a = matrix[0][0],
96             b = matrix[1][0],
97             c = matrix[0][1],
98             d = matrix[1][1],
99             e = matrix[0][2],
100             f = matrix[1][2];
101         return new Ext.draw.Matrix(a, b, c, d, e, f);
102     },
103
104     translate: function(x, y) {
105         this.prepend(1, 0, 0, 1, x, y);
106     },
107
108     scale: function(x, y, cx, cy) {
109         var me = this;
110         if (y == null) {
111             y = x;
112         }
113         me.add(1, 0, 0, 1, cx, cy);
114         me.add(x, 0, 0, y, 0, 0);
115         me.add(1, 0, 0, 1, -cx, -cy);
116     },
117
118     rotate: function(a, x, y) {
119         a = Ext.draw.Draw.rad(a);
120         var me = this,
121             cos = +Math.cos(a).toFixed(9),
122             sin = +Math.sin(a).toFixed(9);
123         me.add(cos, sin, -sin, cos, x, y);
124         me.add(1, 0, 0, 1, -x, -y);
125     },
126
127     x: function(x, y) {
128         var matrix = this.matrix;
129         return x * matrix[0][0] + y * matrix[0][1] + matrix[0][2];
130     },
131
132     y: function(x, y) {
133         var matrix = this.matrix;
134         return x * matrix[1][0] + y * matrix[1][1] + matrix[1][2];
135     },
136
137     get: function(i, j) {
138         return + this.matrix[i][j].toFixed(4);
139     },
140
141     toString: function() {
142         var me = this;
143         return [me.get(0, 0), me.get(0, 1), me.get(1, 0), me.get(1, 1), 0, 0].join();
144     },
145
146     toSvg: function() {
147         var me = this;
148         return &quot;matrix(&quot; + [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() + &quot;)&quot;;
149     },
150
151     toFilter: function() {
152         var me = this;
153         return &quot;progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand',FilterType=bilinear,M11=&quot; + me.get(0, 0) +
154             &quot;, M12=&quot; + me.get(0, 1) + &quot;, M21=&quot; + me.get(1, 0) + &quot;, M22=&quot; + me.get(1, 1) +
155             &quot;, Dx=&quot; + me.get(0, 2) + &quot;, Dy=&quot; + me.get(1, 2) + &quot;)&quot;;
156     },
157
158     offset: function() {
159         var matrix = this.matrix;
160         return [(matrix[0][2] || 0).toFixed(4), (matrix[1][2] || 0).toFixed(4)];
161     },
162
163     // Split matrix into Translate Scale, Shear, and Rotate
164     split: function () {
165         function norm(a) {
166             return a[0] * a[0] + a[1] * a[1];
167         }
168         function normalize(a) {
169             var mag = Math.sqrt(norm(a));
170             a[0] /= mag;
171             a[1] /= mag;
172         }
173         var matrix = this.matrix,
174             out = {
175                 translateX: matrix[0][2],
176                 translateY: matrix[1][2]
177             },
178             row;
179
180         // scale and shear
181         row = [[matrix[0][0], matrix[0][1]], [matrix[1][0], matrix[1][1]]];
182         out.scaleX = Math.sqrt(norm(row[0]));
183         normalize(row[0]);
184
185         out.shear = row[0][0] * row[1][0] + row[0][1] * row[1][1];
186         row[1] = [row[1][0] - row[0][0] * out.shear, row[1][1] - row[0][1] * out.shear];
187
188         out.scaleY = Math.sqrt(norm(row[1]));
189         normalize(row[1]);
190         out.shear /= out.scaleY;
191
192         // rotation
193         out.rotate = Math.asin(-row[0][1]);
194
195         out.isSimple = !+out.shear.toFixed(9) &amp;&amp; (out.scaleX.toFixed(9) == out.scaleY.toFixed(9) || !out.rotate);
196
197         return out;
198     }
199 });
200 </pre>
201 </body>
202 </html>