8

私は d3.js に 2 つの単純なオブジェクトを持っています。それらはビューポートの中心を回っているはずです (太陽の周りの惑星のように)。

私はd3.jsが初めてで、トランジションを使用する必要があることを知っていますが、惑星は常に出入りするだけでなく、常に一周する必要があるため、トランジションを設定する場所と方法がわかりません。

これが私の現在のコードです:

var planets = [
    {d:100,r:2},
    {d:150,r:4}
];

var w = 500, h = 400, svg, circle;

function init(){

    svg = d3.select("#drawArea").append("svg").attr({width: w, height: h});

    var center = {
        x: Math.floor(w/2),
        y: Math.floor(h/2)
    };

    svg.append('circle').attr({
        'cx': center.x,
        'cy': center.y,
        'r': 10,
        'class': 'sun'
    });

    circle = svg.selectAll(".planet")
        .data(planets)
        .enter()
            .append("circle")
                .attr("class", "planet")
                .attr("r", function(s){return s.r});

    circle.attr({
        // distance from the center
        'cx': function(s){ return center.x - s.d; },
        // center of the screen
        'cy': function(s){ return center.y; }
    });

}

そして、ここで遊ぶためのjsfiddleがあります。

4

2 に答える 2

13

必要がある:

  1. 惑星を太陽を中心としgたグループに配置しますg
  2. d3.timerグループをローテーションする を作成します。

使用例については、d3.timerMike Bostocksエピサイクリック ギアリングの例を参照してください。その例を使用して、あなたが尋ねたものに似たものをまとめました: http://bl.ocks.org/4953593

例の核心:

  var w = 800, h = 800;
  var t0 = Date.now();

  var planets = [
    { R: 300, r:  5, speed: 5, phi0: 90},
    { R: 150, r: 10, speed: 2, phi0: 190}
  ];


  var svg = d3.select("#planetarium").insert("svg")
    .attr("width", w).attr("height", h);

  svg.append("circle").attr("r", 20).attr("cx", w/2)
    .attr("cy", h/2).attr("class", "sun")

  var container = svg.append("g")
    .attr("transform", "translate(" + w/2 + "," + h/2 + ")")

  container.selectAll("g.planet").data(planets).enter().append("g")
    .attr("class", "planet").each(function(d, i) {
      d3.select(this).append("circle").attr("class", "orbit")
        .attr("r", d.R);
      d3.select(this).append("circle").attr("r", d.r).attr("cx",d.R)
        .attr("cy", 0).attr("class", "planet");
    });

  d3.timer(function() {
    var delta = (Date.now() - t0);
    svg.selectAll(".planet").attr("transform", function(d) {
      return "rotate(" + d.phi0 + delta * d.speed/200 + ")";
    });
  });
于 2013-02-14T15:46:23.967 に答える