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); |
---|