toolkit/javascript/d3/src/svg/arc.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 d3.svg.arc = function() {
       
     2   var innerRadius = d3_svg_arcInnerRadius,
       
     3       outerRadius = d3_svg_arcOuterRadius,
       
     4       startAngle = d3_svg_arcStartAngle,
       
     5       endAngle = d3_svg_arcEndAngle;
       
     6 
       
     7   function arc() {
       
     8     var r0 = innerRadius.apply(this, arguments),
       
     9         r1 = outerRadius.apply(this, arguments),
       
    10         a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset,
       
    11         a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset,
       
    12         da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0),
       
    13         df = da < Math.PI ? "0" : "1",
       
    14         c0 = Math.cos(a0),
       
    15         s0 = Math.sin(a0),
       
    16         c1 = Math.cos(a1),
       
    17         s1 = Math.sin(a1);
       
    18     return da >= d3_svg_arcMax
       
    19       ? (r0
       
    20       ? "M0," + r1
       
    21       + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
       
    22       + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
       
    23       + "M0," + r0
       
    24       + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0)
       
    25       + "A" + r0 + "," + r0 + " 0 1,0 0," + r0
       
    26       + "Z"
       
    27       : "M0," + r1
       
    28       + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1)
       
    29       + "A" + r1 + "," + r1 + " 0 1,1 0," + r1
       
    30       + "Z")
       
    31       : (r0
       
    32       ? "M" + r1 * c0 + "," + r1 * s0
       
    33       + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
       
    34       + "L" + r0 * c1 + "," + r0 * s1
       
    35       + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0
       
    36       + "Z"
       
    37       : "M" + r1 * c0 + "," + r1 * s0
       
    38       + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1
       
    39       + "L0,0"
       
    40       + "Z");
       
    41   }
       
    42 
       
    43   arc.innerRadius = function(v) {
       
    44     if (!arguments.length) return innerRadius;
       
    45     innerRadius = d3.functor(v);
       
    46     return arc;
       
    47   };
       
    48 
       
    49   arc.outerRadius = function(v) {
       
    50     if (!arguments.length) return outerRadius;
       
    51     outerRadius = d3.functor(v);
       
    52     return arc;
       
    53   };
       
    54 
       
    55   arc.startAngle = function(v) {
       
    56     if (!arguments.length) return startAngle;
       
    57     startAngle = d3.functor(v);
       
    58     return arc;
       
    59   };
       
    60 
       
    61   arc.endAngle = function(v) {
       
    62     if (!arguments.length) return endAngle;
       
    63     endAngle = d3.functor(v);
       
    64     return arc;
       
    65   };
       
    66 
       
    67   arc.centroid = function() {
       
    68     var r = (innerRadius.apply(this, arguments)
       
    69         + outerRadius.apply(this, arguments)) / 2,
       
    70         a = (startAngle.apply(this, arguments)
       
    71         + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;
       
    72     return [Math.cos(a) * r, Math.sin(a) * r];
       
    73   };
       
    74 
       
    75   return arc;
       
    76 };
       
    77 
       
    78 var d3_svg_arcOffset = -Math.PI / 2,
       
    79     d3_svg_arcMax = 2 * Math.PI - 1e-6;
       
    80 
       
    81 function d3_svg_arcInnerRadius(d) {
       
    82   return d.innerRadius;
       
    83 }
       
    84 
       
    85 function d3_svg_arcOuterRadius(d) {
       
    86   return d.outerRadius;
       
    87 }
       
    88 
       
    89 function d3_svg_arcStartAngle(d) {
       
    90   return d.startAngle;
       
    91 }
       
    92 
       
    93 function d3_svg_arcEndAngle(d) {
       
    94   return d.endAngle;
       
    95 }