[76] | 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); |
---|