javascript – 如何在d3.js中围绕中心旋转对象

前端之家收集整理的这篇文章主要介绍了javascript – 如何在d3.js中围绕中心旋转对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在d3.js中有两个简单的物体,它们应围绕视口的中心盘旋(就像围绕太阳的行星一样).

我是d3.js的新手,我知道我必须使用过渡但是因为行星必须一直循环而不仅仅是进入或退出我不知道在哪里以及如何设置过渡.

这是我目前的代码

  1. var planets = [
  2. {d:100,r:2},{d:150,r:4}
  3. ];
  4.  
  5. var w = 500,h = 400,svg,circle;
  6.  
  7. function init(){
  8.  
  9. svg = d3.select("#drawArea").append("svg").attr({width: w,height: h});
  10.  
  11. var center = {
  12. x: Math.floor(w/2),y: Math.floor(h/2)
  13. };
  14.  
  15. svg.append('circle').attr({
  16. 'cx': center.x,'cy': center.y,'r': 10,'class': 'sun'
  17. });
  18.  
  19. circle = svg.selectAll(".planet")
  20. .data(planets)
  21. .enter()
  22. .append("circle")
  23. .attr("class","planet")
  24. .attr("r",function(s){return s.r});
  25.  
  26. circle.attr({
  27. // distance from the center
  28. 'cx': function(s){ return center.x - s.d; },// center of the screen
  29. 'cy': function(s){ return center.y; }
  30. });
  31.  
  32. }

这里有一个jsfiddle玩.

解决方法

你需要:

>将你的行星放在以g为中心的g组中
>创建一个用于旋转组的d3.timer.

有关使用d3.timer的示例,请参阅Mike Bostocks Epicyclic Gearing示例.使用这个例子,我把类似于你问的东西放在一起:http://bl.ocks.org/4953593

示例的核心:

  1. var w = 800,h = 800;
  2. var t0 = Date.now();
  3.  
  4. var planets = [
  5. { R: 300,r: 5,speed: 5,phi0: 90},{ R: 150,r: 10,speed: 2,phi0: 190}
  6. ];
  7.  
  8.  
  9. var svg = d3.select("#planetarium").insert("svg")
  10. .attr("width",w).attr("height",h);
  11.  
  12. svg.append("circle").attr("r",20).attr("cx",w/2)
  13. .attr("cy",h/2).attr("class","sun")
  14.  
  15. var container = svg.append("g")
  16. .attr("transform","translate(" + w/2 + "," + h/2 + ")")
  17.  
  18. container.selectAll("g.planet").data(planets).enter().append("g")
  19. .attr("class","planet").each(function(d,i) {
  20. d3.select(this).append("circle").attr("class","orbit")
  21. .attr("r",d.R);
  22. d3.select(this).append("circle").attr("r",d.r).attr("cx",d.R)
  23. .attr("cy",0).attr("class","planet");
  24. });
  25.  
  26. d3.timer(function() {
  27. var delta = (Date.now() - t0);
  28. svg.selectAll(".planet").attr("transform",function(d) {
  29. return "rotate(" + d.phi0 + delta * d.speed/200 + ")";
  30. });
  31. });

猜你在找的JavaScript相关文章