2013-06-18 7 views
9

フォースレイアウトの最初のアニメーションに影響を与えることについて多くを読んだことがありますが、まだ理解していないのでしょうか?d3.jsフォースレイアウトの初期アニメーションを制御する

this exampleを効果的に「停止」する方法を見つけました(実装可能)。

しかし、私の質問は、それを制御することができるかどうかです(つまり、「強制停止」までにどれくらい時間がかかりますか?)。 アルファを変更するためのパラメータであるが、それは(私は任意の顕著な違いのないゼロと正の値、負の値を試してみました)違いをしないと思われるドキュメントから

yrscc私がやろうとしています何のfiddle:ここ

は私がやろうとしています何のjsdiddleです。

var force = d3.layout.force() 
    .nodes(d3.values(datax.nodes)) 
    .links(datax.links) 
    .size([xViewPortArea.Width, xViewPortArea.Height]) 
    .linkDistance(xGraphParameters.xLinkDistance) 
    .charge(xGraphParameters.xCharge) 
    .on("tick", tick) 
    .alpha(-5) // HERE 
    .start(); 

私の質問:

  • アルファの値が実際に反復回数に影響を与えるのでしょうか? (値が正でなく、強制レイアウトが実行されている場合、このメソッドは次のティックで強制レイアウトを停止して「終了」を送出するin the documentation
  • この中にはthis postingという機能が提案されています。。明らかにすることができますしかし、一つは、それを呼び出すことになっている場合、私は理解していない@JohnS

PSによって:別のクールなオプションは、画面上の画像を持っているし、その後、バックグラウンドで最適なレイアウトを計算することであるlike hereしかし、私はそれを実装しようとしました

答えて

10

力のレイアウトを冷却する1つの方法は、ダニイベントを強制することです:

var k = 0; 
while ((force.alpha() > 1e-2) && (k < 150)) { 
    force.tick(), 
    k = k + 1; 
} 

アルファ値は力の温度を測定し、低い値はレイアウトがより安定していることを示します。それが安定していると考えるティックの数はノードの数に依存しますが、私は50〜200で良い結果を得ています。摩擦係数は力を安定させるのに役立つが、レイアウトはあまり最適ではない。

+0

が優れています。ありがとう。私はちょうど私のファイルの最後にコードをコピーし、それは完全に動作します。 P.S:私もフリクションで遊んでいましたが、それはアニメーションを遅くしますが、ネットワークの奇妙な形になります。 – user1043144

+0

これは、少し単純化することができますwhile(force.alpha()){force.tick(); } '、またはwhile(force.alpha()> 1e-5){force.tick();} } 'レイアウトを計算しないレベルを制御したい場合 –

関連する問題