gpt4 book ai didi

javascript - D3 中的圆圈过渡

转载 作者:行者123 更新时间:2023-11-30 18:15:45 25 4
gpt4 key购买 nike

我已经设置了一个带过渡的 D3 圆形动画。我使用最小日期作为初始数据点,最大日期作为转换的最终数据点。我的问题是:

我正在使用一个相当大的数据集,恐怕因为我只告诉过渡从最小到最大,它会错过中间的所有其他点,例如,如果圆 A 有一个中间疯狂跳跃?当我测试它时,它似乎刚刚跳过了跳跃。

有没有更好的方法来设置过渡以考虑其间的所有点?

最佳答案

如果您告诉对象从最小值转换为最大值,它只会尊重这两个值,并且正如您所说,它会跳过两者之间的任何有趣的跳跃。

我猜你目前通过插入所有数据来绘制一次图表。相反,您可以逐步将数据推送到图表:

var data = [{id: o1, v: []}, {id: o2, v: []}]; // values for 2 objects

function getTransform(d) {
return "translate(" + d.v[d.v.length-1] + ")";
}

function update() {
var elems = d3.selectAll(...).data(data, function(d) {return d.id;})
elems.enter()
.append(...) //append DOM/SVG objects and
.attr(...) //initalize their start values and
.attr("transform", getTransform ) //their start animation values

// animate the existing elements to move to their new values
elems.transition().attr("transform", getTransform )
}

function play(){
// pushing in "crazy" values
data[0].v.push( Math.random()*10 );
data[1].v.push( Math.random()*10 );
update();
}

setTimeout(play, 500)
setTimeout(play, 1000)
setTimeout(play, 1500)

基本思想是不要一次将所有数据都扔到 d3 中,而是按照您希望动画显示的顺序和及时性添加数据。

此外,或者您可以设置一个时间索引并在 getTransform 函数中使用它来设置您想要的任何状态的动画。如果你一步一步地这样做,你会让动画使用你的“疯狂”值。

var time = 0;
var maxTime = 2;

function getTransform(d) {
return "translate(" + d.v[time] + ")";
}

function next(){
update();
if(time++ < maxTime) setTimeout(next, 500)
}

play(); play(); play(); // add some data ;)
next() // start index based playback from `time` to `maxTime`

您可能需要将超时值 500 与您想要的动画 duration(..) 速度相匹配,以使动画达到您的疯狂峰值。否则 d3 可能会使动画路径平滑(如果更新速度比动画快)。

关于javascript - D3 中的圆圈过渡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com