|
1 d3.svg.symbol = function() { |
|
2 var type = d3_svg_symbolType, |
|
3 size = d3_svg_symbolSize; |
|
4 |
|
5 function symbol(d, i) { |
|
6 return (d3_svg_symbols[type.call(this, d, i)] |
|
7 || d3_svg_symbols.circle) |
|
8 (size.call(this, d, i)); |
|
9 } |
|
10 |
|
11 symbol.type = function(x) { |
|
12 if (!arguments.length) return type; |
|
13 type = d3.functor(x); |
|
14 return symbol; |
|
15 }; |
|
16 |
|
17 // size of symbol in square pixels |
|
18 symbol.size = function(x) { |
|
19 if (!arguments.length) return size; |
|
20 size = d3.functor(x); |
|
21 return symbol; |
|
22 }; |
|
23 |
|
24 return symbol; |
|
25 }; |
|
26 |
|
27 function d3_svg_symbolSize() { |
|
28 return 64; |
|
29 } |
|
30 |
|
31 function d3_svg_symbolType() { |
|
32 return "circle"; |
|
33 } |
|
34 |
|
35 // TODO cross-diagonal? |
|
36 var d3_svg_symbols = { |
|
37 "circle": function(size) { |
|
38 var r = Math.sqrt(size / Math.PI); |
|
39 return "M0," + r |
|
40 + "A" + r + "," + r + " 0 1,1 0," + (-r) |
|
41 + "A" + r + "," + r + " 0 1,1 0," + r |
|
42 + "Z"; |
|
43 }, |
|
44 "cross": function(size) { |
|
45 var r = Math.sqrt(size / 5) / 2; |
|
46 return "M" + -3 * r + "," + -r |
|
47 + "H" + -r |
|
48 + "V" + -3 * r |
|
49 + "H" + r |
|
50 + "V" + -r |
|
51 + "H" + 3 * r |
|
52 + "V" + r |
|
53 + "H" + r |
|
54 + "V" + 3 * r |
|
55 + "H" + -r |
|
56 + "V" + r |
|
57 + "H" + -3 * r |
|
58 + "Z"; |
|
59 }, |
|
60 "diamond": function(size) { |
|
61 var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), |
|
62 rx = ry * d3_svg_symbolTan30; |
|
63 return "M0," + -ry |
|
64 + "L" + rx + ",0" |
|
65 + " 0," + ry |
|
66 + " " + -rx + ",0" |
|
67 + "Z"; |
|
68 }, |
|
69 "square": function(size) { |
|
70 var r = Math.sqrt(size) / 2; |
|
71 return "M" + -r + "," + -r |
|
72 + "L" + r + "," + -r |
|
73 + " " + r + "," + r |
|
74 + " " + -r + "," + r |
|
75 + "Z"; |
|
76 }, |
|
77 "triangle-down": function(size) { |
|
78 var rx = Math.sqrt(size / d3_svg_symbolSqrt3), |
|
79 ry = rx * d3_svg_symbolSqrt3 / 2; |
|
80 return "M0," + ry |
|
81 + "L" + rx +"," + -ry |
|
82 + " " + -rx + "," + -ry |
|
83 + "Z"; |
|
84 }, |
|
85 "triangle-up": function(size) { |
|
86 var rx = Math.sqrt(size / d3_svg_symbolSqrt3), |
|
87 ry = rx * d3_svg_symbolSqrt3 / 2; |
|
88 return "M0," + -ry |
|
89 + "L" + rx +"," + ry |
|
90 + " " + -rx + "," + ry |
|
91 + "Z"; |
|
92 } |
|
93 }; |
|
94 |
|
95 d3.svg.symbolTypes = d3.keys(d3_svg_symbols); |
|
96 |
|
97 var d3_svg_symbolSqrt3 = Math.sqrt(3), |
|
98 d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); |