|
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 } |