toolkit/javascript/d3/src/core/transform.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     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;