首先,我研究了一些相关的项目,尝试过了,但没有得到很好的结果。链式转换不会触发分步
- https://stackoverflow.com/questions/28612706/step-by-step-transitions-using-d3-js
- Queue of transitions in d3.js; one by one
- D3.js chain transitions for compound animations for different shapes
接下来,我的代码的相关部分:
function moveMarker(i) {
var curr_i = parseInt(d3.select("#nomad").attr("nomad-index"));
var target_i = parseInt(i);
switch (curr_i) {
case 0:
switch (target_i) {
case 0:
break;
case 1:
moveToMark(1);
break;
case 2:
moveToMark(1);
moveToMark(2);
break;
case 3:
moveToMark(1);
moveToMark(2);
moveToMark(3);
break;
case 4:
moveToMark(1);
moveToMark(2);
moveToMark(3);
moveToMark(4);
break;
}
case 1:
switch (target_i) {
case 0:
moveToMark(0);
break;
case 1:
break;
case 2:
moveToMark(2);
break;
case 3:
moveToMark(2);
moveToMark(3);
break;
case 4:
moveToMark(2);
moveToMark(3);
moveToMark(4);
break;
}
case 2:
switch (target_i) {
case 0:
moveToMark(1);
moveToMark(0);
break;
case 1:
moveToMark(1);
break;
case 2:
break;
case 3:
moveToMark(3);
break;
case 4:
moveToMark(3);
moveToMark(4);
break;
}
case 3:
switch (target_i) {
case 0:
moveToMark(2);
moveToMark(1);
moveToMark(0);
break;
case 1:
moveToMark(2);
moveToMark(1);
break;
case 2:
moveToMark(2);
break;
case 3:
break;
case 4:
moveToMark(4);
break;
}
case 4:
switch (target_i) {
case 0:
moveToMark(3);
moveToMark(2);
moveToMark(1);
moveToMark(0);
break;
case 1:
moveToMark(3);
moveToMark(2);
moveToMark(1);
break;
case 2:
moveToMark(3);
moveToMark(2);
break;
case 3:
moveToMark(3);
break;
case 4:
break;
}
}
}
function moveToMark(i) {
var x = spot[i][7]; // Latitude
var y = spot[i][8]; // Longitude
d3.select("#nomad")
.attr("nomad-index", i)
.transition()
.delay(3000)
.duration(1000)
.attr("cx", x)
.attr("cy", y);
}
的我想要做的要点:
我有一个事件表。在点击表格中的任何事件时,我会有一个圆圈(nomad
),移动到spot
数据集中确定的该事件的相应位置。直接移动点对点是没有问题的。但是,我有一个特别的限制:我必须根据事件的时间表移动我。
说,我点击事件#3。我的圈子必须首先进入事件#1和#2,之后他们会留在事件#3。如果圆圈无论如何,点击任何其他事件,无论是较低还是较高索引,都需要遍历当前位置与其目标之间的事件。
我相信我的嵌套开关盒可以进一步解释这一点。我相信我所尝试的并不像我想要的那样复杂。然而,我遇到了一个重大障碍:我的圈子并没有一步一步地经历事件,而是在延迟之后马上跳到最后一个事件。
我已经在上面的链接中看到转换有关于链接的问题,或者我必须雇用end(...)
来完成此项工作。
问题/ S:
是否有可能减少这种尝试递归函数呢?如果是这样,怎么样?如果不是,我该如何使每个moveToMark
连续发射?
似乎是这样的路要走。谢谢! – Manhattan