2013-02-14 28 views
7

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です:

は、ここに私の現在のコードです。

答えて

13

あなたがする必要がある:あなたの日

  • を中心にggグループで

    1. 場所をあなたの惑星は、あなたがあなたのグループを回転するd3.timerを作成します。

    例えば、d3.timerの使用例については、Mike Bostocks Epicyclic Gearingを参照してください。私はこれが遅すぎる来るかもしれない知っている

    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 + ")"; 
        }); 
        }); 
    
  • +0

    素晴らしい、非常に多くと歓迎のStackOverflowにありがとうございました! – Marc

    +0

    私はそれが古いことを知っていますが、私はこのポストに出くわしました。 と惑星が回転している理由はありますか?私はいくつかのテストを惑星だけを回転させ、グループと結果だけが同じですが、少し遅くなりました(これは回転効果の半分をカットするので正常です)。 – vIceBerg

    2

    :例のhttp://bl.ocks.org/4953593

    コア:その例を使用して、私は一緒にあなたが尋ねたものと同様のものを置きます。しかし、私は、将来の読者が同じ問題に直面している場合、これが役立つことを願っています。 私はフィドルを作成し、ここでいくつかの説明を追加し、それが役立つことを願って:ここでは

    http://www.zestyrock.com/data-visualization/d3-rotate-object-around-the-center-object-part-2/

    はコードです:

    var start = Date.now(); 
    
    var mode = 0; 
    
    var svg = d3.select("#canvas") 
        .append("svg") 
        .attr("width", 500) 
        .attr("height", 500); 
    
    svg.append("circle") 
        .attr("r", 50) 
        .attr("cx", 250) 
        .attr("cy", 250) 
        .attr("fill", "#e05038"); 
    
    var rotateElements = svg.append("g"); 
    
    rotateElements.append("circle") 
        .attr("r", 25) 
        .attr("cx", 250) 
        .attr("cy", 50) 
        .attr("fill", "#f2b632") 
        .attr("class", "orangeNode"); 
    
    rotateElements.append("line") 
        .attr("x1", 250) 
        .attr("y1", 75) 
        .attr("x2", 250) 
        .attr("y2", 200) 
        .attr("class", "edge") 
        .attr("stroke", "grey"); 
    
    
    d3.select("#start") 
        .on("click", startAnimation); 
    
    function startAnimation() { 
        if (mode === 0) { 
         d3.timer(function() { 
          var angle = (Date.now() - start); 
          var transform = function() { 
           return "rotate(" + angle + ", 250, 250)"; 
          }; 
          d3.selectAll(".orangeNode, .edge") 
           .attr("transform", transform); 
    
          if (mode === 0) { 
           return true; 
          } else { 
           return false; 
          } 
         }); 
         mode = 1; 
        } else { 
         mode = 0; 
        } 
    
    } 
    
    +1

    リンクは古いです – luQ

    関連する問題