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;
}
}
原点、つまり指定したx、yからの距離にalpha * 0.1を掛けた分だけ座標を更新する。alphaが1であれば、10%ずつ原点に近づくように移動する。
また、alphaはシミュレーションの1ステップごとに次の式が加算され、更新される。
( alphaTarget – alpha ) * alphaDecay
デフォルトのalphaTargetは0、alphaDecayは0.0228であるため、alphaは徐々に減少する。このalphaがalphaMin、デフォルト値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]) |
イベントリスナーを登録する。 同じタイプと名前のイベントリスナーがすでに登録されている場合、新しいリスナーで上書きする。 listenerがnullの場合、イベントリスナーを削除する。typenamesには"tick"と"end"を指定できる。
|
付録: 用語
decay
- [名詞] 腐敗、腐食
- [名詞] 社会制度などの衰退、退廃
- [動詞] 腐敗する、腐る。腐敗させる、腐らせる
- [動詞] 建物や地域が荒廃する
velocity
- [名詞][専門用語] 速度
- [名詞][格式] 速い速度
tick
- [動詞] カチカチ鳴る
- [動詞] 正解などにチェックマークを付ける
- [名詞] チェックマーク
- [名詞] ダニ