多体力
多体(またはn体)力は、すべてのノード間で相互に作用します。 強さが正の場合、重力(引力)をシミュレートするために使用でき、強さが負の場合、静電気(斥力)をシミュレートするために使用できます。この実装では、パフォーマンスを大幅に向上させるために、四分木とバーンズハット近似を使用しています。精度は、thetaパラメーターを使用してカスタマイズできます。
2つのリンクされたノードにのみ影響するリンク力とは異なり、電荷力はグローバルです。接続されていないサブグラフにある場合でも、すべてのノードが他のすべてのノードに影響を与えます。
forceManyBody()
ソース · デフォルトのパラメーターで新しい多体力を作成します。
const manyBody = d3.forceManyBody().strength(-100);
manyBody.strength(strength)
ソース · strengthが指定されている場合、強度アクセサーを指定された数値または関数に設定し、各ノードの強度アクセサーを再評価して、この力を返します。正の値はノードが互いに引き合うようにします。重力に似ており、負の値はノードが互いに反発するようにします。静電気に似ています。strengthが指定されていない場合は、現在の強度アクセサーを返します。これはデフォルトで
function strength() {
return -30;
}
強度アクセサーは、シミュレーションの各ノードに対して呼び出され、ノードとゼロベースのインデックスが渡されます。結果の数値は内部に格納され、各ノードの強度は、力の初期化時、または新しいstrengthでこのメソッドが呼び出された場合にのみ再計算され、力が適用されるたびには再計算されません。
manyBody.theta(theta)
ソース · thetaが指定されている場合は、バーンズハット近似基準を指定された数値に設定し、この力を返します。thetaが指定されていない場合は、現在の値を返します。これはデフォルトで0.9です。
計算を高速化するために、この力はバーンズハット近似を実装します。これは、nがノードの数である場合、アプリケーションごとにO(n log n) を要します。各アプリケーションに対して、四分木は現在のノード位置を格納します。次に、各ノードに対して、与えられたノードに対する他のすべてのノードの合力が計算されます。遠く離れたノードのクラスターの場合、電荷力はクラスターを単一のより大きなノードとして扱うことで近似できます。thetaパラメーターは、近似の精度を決定します。四分木セルの幅wとノードからセルの重心までの距離lの比率w / lがthetaよりも小さい場合、与えられたセル内のすべてのノードは個別にではなく、単一のノードとして扱われます。
manyBody.distanceMin(distance)
ソース · distanceが指定されている場合、この力が考慮されるノード間の最小距離を設定します。distanceが指定されていない場合は、現在の最小距離を返します。これはデフォルトで1です。最小距離は、近くの2つのノード間の力の強さの上限を設定し、不安定性を回避します。特に、2つのノードが完全に一致する場合、無限に強い力を回避します。この場合、力の方向はランダムです。
manyBody.distanceMax(distance)
ソース · distanceが指定されている場合、この力が考慮されるノード間の最大距離を設定します。distanceが指定されていない場合は、現在の最大距離を返します。これはデフォルトで無限大です。有限の最大距離を指定すると、パフォーマンスが向上し、より局所的なレイアウトが生成されます。