toolkit/exemples/couple/javascript/d3/src/svg/symbol.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     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);