2014-10-29 37 views
5

我有一個d3力佈局圖,即非常好地工作,但它往往過早地「卡住」。例如,節點向一個很好的位置擺動,如果'碰撞'(注入一些隨機性到他們的位置並再次,他們終於到達那裏)。如果我減少friction,問題也變得更糟,因爲用戶認爲它是修改d3的力佈局「annealling」時間表

我在force.js source code中看到'annealling'(ala模擬退火)的提及,並且暴露的alpha參數是一個關鍵因素,我想知道是否有人想出如何直接管理通用退火時間表(沒有修補force.js!)?

+0

不知道我是否理解你的問題。修改任何未公開的內容將需要更改源代碼。 – 2014-10-29 19:01:21

+0

如果某個圖形太大或太多以至於不能一次性佈置,我可能會嘗試隨着時間的推移添加節點,並在每次添加時重新開始佈局。它更好,如果有一個邏輯像節點的時間或類型組件。 – Andrew 2014-10-29 20:24:54

+0

@Lars,對不起,我不清楚。 'alpha'似乎是唯一暴露的參數,但我只能用它做很多事情。我問是否有辦法以d3-ic的方式完成更一般的冷卻時間表,還是我需要做一個本地補丁? @Andrew,我希望這是一個由用戶修改的圖形viz工具,通過一個固定的圖形。 – rikb 2014-10-29 20:43:02

回答

0

答案的核心是@ meetamit的評論(加速alpha的衰變)。你可以當它低於閾值時也停止調用佈局,並且您還可以通過向節點/鏈接移動添加轉換來處理「抖動」。

animationStep = 200; 
force.on('tick', function() { 
    node.transition().ease('linear').duration(animationStep) 
     .attr('transform', function(d) { 
      //your node transitions here 
     }); 
    var alpha = force.alpha(); 
    force.stop(); 
    setTimeout(function() { 
     if (!alpha > 0.001) { 
     force.alpha(alpha * 0.9); 
     } 
    }, animationStep); 
    }; 
    force.on('tick', tick); 
+0

我認爲OP正在尋找一種方法來實現_decelerate_,但無論如何,管理alpha的最簡單方法是將'force.alpha(force.alpha( )/0.99*myDecay)'在'tick'回調結束時。這將顛倒佈局應用的衰減(0.99),並用您自己的幾何衰減速率替換它。 – 2015-09-10 19:45:39

+0

啊 - 謝謝,我讀錯了。 – 2015-09-10 23:36:03