首先,我研究了一些相關的項目,嘗試過了,但沒有得到很好的結果。鏈式轉換不會觸發分步
- 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