|
1 d3.transform = function(string) { |
|
2 d3_transformG.setAttribute("transform", string); |
|
3 return new d3_transform(d3_transformG.transform.baseVal.consolidate().matrix); |
|
4 }; |
|
5 |
|
6 // Compute x-scale and normalize the first row. |
|
7 // Compute shear and make second row orthogonal to first. |
|
8 // Compute y-scale and normalize the second row. |
|
9 // Finally, compute the rotation. |
|
10 function d3_transform(m) { |
|
11 var r0 = [m.a, m.b], |
|
12 r1 = [m.c, m.d], |
|
13 kx = d3_transformNormalize(r0), |
|
14 kz = d3_transformDot(r0, r1), |
|
15 ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)); |
|
16 this.translate = [m.e, m.f]; |
|
17 this.rotate = Math.atan2(m.b, m.a) * d3_transformDegrees; |
|
18 this.scale = [kx, ky || 0]; |
|
19 this.skew = ky ? kz / ky * d3_transformDegrees : 0; |
|
20 }; |
|
21 |
|
22 d3_transform.prototype.toString = function() { |
|
23 return "translate(" + this.translate |
|
24 + ")rotate(" + this.rotate |
|
25 + ")skewX(" + this.skew |
|
26 + ")scale(" + this.scale |
|
27 + ")"; |
|
28 }; |
|
29 |
|
30 function d3_transformDot(a, b) { |
|
31 return a[0] * b[0] + a[1] * b[1]; |
|
32 } |
|
33 |
|
34 function d3_transformNormalize(a) { |
|
35 var k = Math.sqrt(d3_transformDot(a, a)); |
|
36 a[0] /= k; |
|
37 a[1] /= k; |
|
38 return k; |
|
39 } |
|
40 |
|
41 function d3_transformCombine(a, b, k) { |
|
42 a[0] += k * b[0]; |
|
43 a[1] += k * b[1]; |
|
44 return a; |
|
45 } |
|
46 |
|
47 var d3_transformG = document.createElementNS(d3.ns.prefix.svg, "g"), |
|
48 d3_transformDegrees = 180 / Math.PI; |