2016-08-19 8 views
4

この質問は、「グラフを初期化した後にD3-Forceパラメータを更新する」(D3-Force updating parameters after initializing graph)というタイトルのフォローアップであり、@altocumulusが回答しました。d3-force updateグラフの初期化後の強制半径の計算

いくつかのノードの半径を変更した後にシミュレーションの強制を更新しようとしています。しかし、私がforceCollideに電話をして変更を説明すると、それは動作しません。

グラフは、第1の半径に対応する力を持っているforceCollideおよび機能を使用して、正しく開始:

var forceCollide = d3.forceCollide() 
.radius(function(d){return d.radius;}) 
.iterations(2) 
.strength(0.95); 

var simulation = d3.forceSimulation() 
.velocityDecay(velocityDecay) 
.force("collide", forceCollide); 

Iは次にd.radiusオブジェクトを変更し、変更を反映するようにforceCollideしたいです。私はforceCollideに呼び出すときしかし、再び、それは動作しません:なぜこれが起こっているの

forceCollide.radius(function(d){ 
d.radius;}) 

任意の考え?

答えて

5

これで実際に半径は更新されません。半径を決定するために使用したコールバックを再設定するだけです。これは以前のものと比べても変化しません。 に変更されても、更新されたデータに基づいて半径が再評価されないため、更新がトリガーされません。

リンクフォースの距離コールバックを更新すると、フォース自体が初期化されます。

force.distance = function(_) { 
    return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; 
}; 

同じことが他の軍のパラメータの他の多くの更新のためにも当てはまる:sourceを見てみると、initializeDistance()への呼び出しを示しています。コールバックは、あなたが再びforceCollide.radius()を呼び出す必要はありません変更されませんので

force.radius = function(_) { 
    return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), force) : radius; 
}; 

collide力の源を見ると

は、しかし、1には、初期化に呼び出さがないことに気づきます。代わりに電話する必要があります

forceCollide.initialize(simulation.nodes()); 

これにより、更新されたデータに基づいて半径が再評価されます。

+0

@altocumulusというクイックアンサーに感謝します。どのようにあなたがそれに到達したか説明する時間を取ってくれてありがとう!私は今、ソースライブラリの有用性を理解しています。 –

関連する問題