Project

General

Profile

Statistics
| Revision:

root / trunk / web / dojo / dojox / gfx / matrix.js

History | View | Annotate | Download (4.38 KB)

1
/*
2
        Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
3
        Available via Academic Free License >= 2.1 OR the modified BSD license.
4
        see: http://dojotoolkit.org/license for details
5
*/
6

    
7

    
8
if(!dojo._hasResource["dojox.gfx.matrix"]){
9
dojo._hasResource["dojox.gfx.matrix"]=true;
10
dojo.provide("dojox.gfx.matrix");
11
(function(){
12
var m=dojox.gfx.matrix;
13
var _1={};
14
m._degToRad=function(_2){
15
return _1[_2]||(_1[_2]=(Math.PI*_2/180));
16
};
17
m._radToDeg=function(_3){
18
return _3/Math.PI*180;
19
};
20
m.Matrix2D=function(_4){
21
if(_4){
22
if(typeof _4=="number"){
23
this.xx=this.yy=_4;
24
}else{
25
if(_4 instanceof Array){
26
if(_4.length>0){
27
var _5=m.normalize(_4[0]);
28
for(var i=1;i<_4.length;++i){
29
var l=_5,r=dojox.gfx.matrix.normalize(_4[i]);
30
_5=new m.Matrix2D();
31
_5.xx=l.xx*r.xx+l.xy*r.yx;
32
_5.xy=l.xx*r.xy+l.xy*r.yy;
33
_5.yx=l.yx*r.xx+l.yy*r.yx;
34
_5.yy=l.yx*r.xy+l.yy*r.yy;
35
_5.dx=l.xx*r.dx+l.xy*r.dy+l.dx;
36
_5.dy=l.yx*r.dx+l.yy*r.dy+l.dy;
37
}
38
dojo.mixin(this,_5);
39
}
40
}else{
41
dojo.mixin(this,_4);
42
}
43
}
44
}
45
};
46
dojo.extend(m.Matrix2D,{xx:1,xy:0,yx:0,yy:1,dx:0,dy:0});
47
dojo.mixin(m,{identity:new m.Matrix2D(),flipX:new m.Matrix2D({xx:-1}),flipY:new m.Matrix2D({yy:-1}),flipXY:new m.Matrix2D({xx:-1,yy:-1}),translate:function(a,b){
48
if(arguments.length>1){
49
return new m.Matrix2D({dx:a,dy:b});
50
}
51
return new m.Matrix2D({dx:a.x,dy:a.y});
52
},scale:function(a,b){
53
if(arguments.length>1){
54
return new m.Matrix2D({xx:a,yy:b});
55
}
56
if(typeof a=="number"){
57
return new m.Matrix2D({xx:a,yy:a});
58
}
59
return new m.Matrix2D({xx:a.x,yy:a.y});
60
},rotate:function(_6){
61
var c=Math.cos(_6);
62
var s=Math.sin(_6);
63
return new m.Matrix2D({xx:c,xy:-s,yx:s,yy:c});
64
},rotateg:function(_7){
65
return m.rotate(m._degToRad(_7));
66
},skewX:function(_8){
67
return new m.Matrix2D({xy:Math.tan(_8)});
68
},skewXg:function(_9){
69
return m.skewX(m._degToRad(_9));
70
},skewY:function(_a){
71
return new m.Matrix2D({yx:Math.tan(_a)});
72
},skewYg:function(_b){
73
return m.skewY(m._degToRad(_b));
74
},reflect:function(a,b){
75
if(arguments.length==1){
76
b=a.y;
77
a=a.x;
78
}
79
var a2=a*a,b2=b*b,n2=a2+b2,xy=2*a*b/n2;
80
return new m.Matrix2D({xx:2*a2/n2-1,xy:xy,yx:xy,yy:2*b2/n2-1});
81
},project:function(a,b){
82
if(arguments.length==1){
83
b=a.y;
84
a=a.x;
85
}
86
var a2=a*a,b2=b*b,n2=a2+b2,xy=a*b/n2;
87
return new m.Matrix2D({xx:a2/n2,xy:xy,yx:xy,yy:b2/n2});
88
},normalize:function(_c){
89
return (_c instanceof m.Matrix2D)?_c:new m.Matrix2D(_c);
90
},clone:function(_d){
91
var _e=new m.Matrix2D();
92
for(var i in _d){
93
if(typeof (_d[i])=="number"&&typeof (_e[i])=="number"&&_e[i]!=_d[i]){
94
_e[i]=_d[i];
95
}
96
}
97
return _e;
98
},invert:function(_f){
99
var M=m.normalize(_f),D=M.xx*M.yy-M.xy*M.yx,M=new m.Matrix2D({xx:M.yy/D,xy:-M.xy/D,yx:-M.yx/D,yy:M.xx/D,dx:(M.xy*M.dy-M.yy*M.dx)/D,dy:(M.yx*M.dx-M.xx*M.dy)/D});
100
return M;
101
},_multiplyPoint:function(_10,x,y){
102
return {x:_10.xx*x+_10.xy*y+_10.dx,y:_10.yx*x+_10.yy*y+_10.dy};
103
},multiplyPoint:function(_11,a,b){
104
var M=m.normalize(_11);
105
if(typeof a=="number"&&typeof b=="number"){
106
return m._multiplyPoint(M,a,b);
107
}
108
return m._multiplyPoint(M,a.x,a.y);
109
},multiply:function(_12){
110
var M=m.normalize(_12);
111
for(var i=1;i<arguments.length;++i){
112
var l=M,r=m.normalize(arguments[i]);
113
M=new m.Matrix2D();
114
M.xx=l.xx*r.xx+l.xy*r.yx;
115
M.xy=l.xx*r.xy+l.xy*r.yy;
116
M.yx=l.yx*r.xx+l.yy*r.yx;
117
M.yy=l.yx*r.xy+l.yy*r.yy;
118
M.dx=l.xx*r.dx+l.xy*r.dy+l.dx;
119
M.dy=l.yx*r.dx+l.yy*r.dy+l.dy;
120
}
121
return M;
122
},_sandwich:function(_13,x,y){
123
return m.multiply(m.translate(x,y),_13,m.translate(-x,-y));
124
},scaleAt:function(a,b,c,d){
125
switch(arguments.length){
126
case 4:
127
return m._sandwich(m.scale(a,b),c,d);
128
case 3:
129
if(typeof c=="number"){
130
return m._sandwich(m.scale(a),b,c);
131
}
132
return m._sandwich(m.scale(a,b),c.x,c.y);
133
}
134
return m._sandwich(m.scale(a),b.x,b.y);
135
},rotateAt:function(_14,a,b){
136
if(arguments.length>2){
137
return m._sandwich(m.rotate(_14),a,b);
138
}
139
return m._sandwich(m.rotate(_14),a.x,a.y);
140
},rotategAt:function(_15,a,b){
141
if(arguments.length>2){
142
return m._sandwich(m.rotateg(_15),a,b);
143
}
144
return m._sandwich(m.rotateg(_15),a.x,a.y);
145
},skewXAt:function(_16,a,b){
146
if(arguments.length>2){
147
return m._sandwich(m.skewX(_16),a,b);
148
}
149
return m._sandwich(m.skewX(_16),a.x,a.y);
150
},skewXgAt:function(_17,a,b){
151
if(arguments.length>2){
152
return m._sandwich(m.skewXg(_17),a,b);
153
}
154
return m._sandwich(m.skewXg(_17),a.x,a.y);
155
},skewYAt:function(_18,a,b){
156
if(arguments.length>2){
157
return m._sandwich(m.skewY(_18),a,b);
158
}
159
return m._sandwich(m.skewY(_18),a.x,a.y);
160
},skewYgAt:function(_19,a,b){
161
if(arguments.length>2){
162
return m._sandwich(m.skewYg(_19),a,b);
163
}
164
return m._sandwich(m.skewYg(_19),a.x,a.y);
165
}});
166
})();
167
dojox.gfx.Matrix2D=dojox.gfx.matrix.Matrix2D;
168
}