⚛️d3.forceSimulationリファレンス
d3-force
simulation.tick([iterations])
指定された反復回数だけシミュレーションを手動でステップし、そのシミュレーションを返します。iterationsが指定されていない場合は、デフォルトで1(シングルステップ)となります。
各イテレーションでは,現在のアルファ値を(alphaTarget - alpha)×alphaDecayでインクリメントし,登録されている各フォースを新しいアルファ値を渡して起動し,各ノードの速度をvelocity×velocityDecayでデクリメントし,最後に各ノードの位置をvelocityでインクリメントする,という処理が行われます.
このメソッドはイベントをディスパッチしません.イベントをディスパッチするのは,シミュレーションが作成時に自動的に開始されたとき,あるいはsimulation.restartを呼び出したときに内部タイマーによって行われます.シミュレーション開始時の自然な秒数は⌈log(alphaMin) / log(1 - alphaDecay)⌋で、デフォルトでは300秒です。
このメソッドは、simulation.stopと併用して、静的なフォースレイアウトを計算することができます。大きなグラフの場合は、ユーザーインターフェースをフリーズさせないために、静的レイアウトをウェブワーカーで計算する必要があります。
# simulation.nodes
nodesが指定された場合,シミュレーションのノードを指定されたオブジェクトの配列に設定し,必要に応じて位置と速度を初期化し,束縛された力を再初期化して,シミュレーションを返します.nodesが指定されていない場合は,コンストラクタで指定されたシミュレーションのノードの配列を返します.
各ノードはオブジェクトでなければなりません.以下のプロパティは,シミュレーションによって割り当てられます.
index - ノードに対するゼロベースのインデックス
x - ノードの現在のx位置
y - ノードの現在のy位置
vx - ノードの現在のx-速度
vy - ノードの現在のy-速度
ノードを所定の位置に固定するには、さらに2つのプロパティを指定することができます。
fx - ノードの固定Xポジション
fy - ノードの固定されたYポジション
固定されていたノードの固定を解除するには、node.fx および node.fy を null に設定するか、これらのプロパティを削除します。
フォースは通常、ノードの現在の位置⟨x,y⟩を読み取り、ノードの速度⟨vx,vy⟩に加算(または減算)します。しかし、力はノードの予想される次の位置、⟨x + vx,y + vy⟩を「先読み」することもできます。これは、反復的な緩和によって幾何学的制約を解決するために必要です。
フォースのセンタリング
センタリングフォースは,すべてのノードの平均位置(すべてのノードの重量が等しい場合は質量中心)が所定の位置⟨x,y⟩になるように,ノードを一様に移動させます.この力は,各アプリケーション上のノードの位置を修正するもので,速度は修正しません.そうすると,ノードがオーバーシュートしたり,目的の中心の周りで振動したりするからです.この力は、ノードをビューポートの中心に保つのに役立ち、ポジショニング力とは異なり、ノードの相対的な位置を歪めません。
リンク力は,希望するリンク距離に応じて,リンクされたノードを押したり離したりする。力の強さは、リンクされたノードの距離と目標とする距離の差に比例し、バネの力のようになります。
The many-body (or n-body) force
多体(またはn体)力は、すべてのノード間で相互に適用されます。正の力であれば重力(引力)を,負の力であれば静電(斥力)をシミュレートするのに利用できます.この実装では、四分木とバーンズハット近似を使用してパフォーマンスを大幅に向上させていますが、精度はthetaパラメータでカスタマイズできます。
リンクはリンクされた2つのノードにしか影響を与えませんが、電荷力はグローバルなものです。つまり、すべてのノードが他のすべてのノードに影響を与え、たとえそれらが切断されたサブグラフ上にあっても影響を与えます。
3次元のn体シミュレーションでは、Barnes-Hutアルゴリズムが再帰的にn体を8分木(2次元シミュレーションでは4分木)に格納してグループに分割します。このツリーの各ノードは、3次元空間の領域を表しています。
一番上のノードは空間全体を表し、その8つの子ノードは空間のオクタンを表します。
空間は再帰的にオクタンに細分化され、各細分化された部分に0または1のボディが含まれるようになります(すべてのオクタンにボディが存在しない領域もあります)。オクツリーには内部ノードと外部ノードの2種類のノードがあります。外部ノードは子を持たず、空であるか1つのボディを表す。内部ノードは、その下にあるボディのグループを表し、質量中心とその子ボディの合計質量を格納します。