D3.js forceSimulationの座標更新アルゴリズム/実行関数

D3.js forceSimulationの座標更新アルゴリズムと実行関数について説明する。

ノード間の相互作用力の設定についてはこちらを、リンク設定についてはこちらを確認する。

座標更新情報

D3.jsのforceSimulationでは、原点を(0, 0)とし、1ステップの位置変化量を(vx, vy)とすると、次の関数で位置変化量を計算する。

function force(alpha) {
  for (var i = 0, n = nodes.length, node, k = alpha * 0.1; i < n; ++i) {
    node = nodes[i];
    node.vx -= node.x * k;
    node.vy -= node.y * k;
  }
}

原点、つまり指定したxyからの距離にalpha * 0.1を掛けた分だけ座標を更新する。alphaが1であれば、10%ずつ原点に近づくように移動する。

また、alphaはシミュレーションの1ステップごとに次の式が加算され、更新される。

( alphaTarget  alpha ) * alphaDecay

デフォルトのalphaTarget0alphaDecay0.0228であるため、alphaは徐々に減少する。このalphaalphaMin、デフォルト値0.001を下回るとシミュレーションは停止する。デフォルトでは約300回の反復計算が実行される設定である。次の機能を使用して、これらの設定とシミュレーション実行を制御できる。

simulation実行関数

関数 説明
simulation.restart() シミュレーションを再開する。
ドラッグなどのイベント発生時に、停止したシミュレーションを起動したいときに使用する。
simulation.stop() シミュレーションを停止する。
すでに停止している場合は何も行わない。
simulation.tick() シミュレーションの内部関数である。
シミュレーション作成時、またはrestart()によって呼び出される。
simulation.node() ノードを指定する。
使用方法はこちらを参照する。
simulation.alpha() alphaの値を0.0から1.0の間で設定する。
デフォルト値は1である。
値を指定しない場合は現在のalpha値を返す。
simulation.alphaMin() alphaMinの値を0.0から1.0の間で設定する。
デフォルト値は0.001である。
値を指定しない場合は現在のalpha値を返す。
シミュレーションは現在のalphaがalphaMinより小さいときに停止する。
simulation.alphaDecay() alphaDecayの値を0.0から1.0の間で設定する。
デフォルト値は0.0228(=1-pow(0.001, 1/300))である。
値を指定しない場合は現在のalphaDecay値を返す。
alphaDecayが大きいほどシミュレーションは速く収束するが、局所解にとどまる可能性がある。
alphaDecayの値を小さくするとシミュレーションの実行に時間がかかるが、より良いレイアウトへ収束する。
シミュレーションを永続的に続けるには、alphaDecayを0に設定するか、alphaTargetをalphaMinより大きい値に設定する。
simulation.alphaTarget() alphaTargetの値を0.0から1.0の間で設定する。
デフォルト値は0である。
値を指定しない場合は現在のalphaTarget値を返す。
simulation.velocityDecay() ノードの速度減衰係数を設定する。
0.0から1.0の値を設定できる。
値が設定されていない場合は、現在の速度減衰係数を返す。
デフォルト値は0.4である。
現在の速度に(1 - velocityDecay)の値が掛けられ、値が大きいほど速度減衰が大きくなる。
0に設定するとノードは振動し続け、1に設定すると速度は変化しない。
simulation.force() ノード間およびリンクの相互作用を設定する関数である。
ノード間についてはこちらを、リンクについてはこちらを参照する。
simulation.find(x,y[,radius]) 指定された検索半径内で、位置(x, y)に最も近いノードを返す。
radiusを指定しない場合、探索半径は無限大になる。
検索領域にノードがない場合はundefinedを返す。
simulation.on(typenames, [listener]) イベントリスナーを登録する。
同じタイプと名前のイベントリスナーがすでに登録されている場合、新しいリスナーで上書きする。
listenernullの場合、イベントリスナーを削除する。
typenamesには"tick""end"を指定できる。
  • tick: シミュレーションステップの更新時
  • end: シミュレーション完了時(alpha < alphaMin

付録: 用語

decay

  1. [名詞] 腐敗、腐食
  2. [名詞] 社会制度などの衰退、退廃
  3. [動詞] 腐敗する、腐る。腐敗させる、腐らせる
  4. [動詞] 建物や地域が荒廃する

velocity

  1. [名詞][専門用語] 速度
  2. [名詞][格式] 速い速度

tick

  1. [動詞] カチカチ鳴る
  2. [動詞] 正解などにチェックマークを付ける
  3. [名詞] チェックマーク
  4. [名詞] ダニ