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

我在d3.js中有两个简单的物体,它们应围绕视口的中心盘旋(就像围绕太阳的行星一样).

我是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玩.

解决方法

你需要:

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

有关使用d3.timer的示例,请参阅Mike Bostocks Epicyclic Gearing示例.使用这个例子,我把类似于你问的东西放在一起: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 + ")";
    });
  });

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)