衝突力
衝突力は、ノードを点ではなく、指定された半径を持つ円として扱い、ノードが重ならないようにします。より正確には、2つのノードaとbは、aとbの間の距離が少なくともradius(a) + radius(b)となるように分離されます。ジッターを減らすために、これはデフォルトでは、設定可能な強度と反復回数を持つ「ソフト」制約です。
forceCollide(radius)
ソース · 指定されたradiusを持つ新しい円衝突力を作成します。radiusが指定されていない場合、すべてのノードに対して定数1がデフォルトとなります。
const collide = d3.forceCollide((d) => d.r);
collide.radius(radius)
ソース · radiusが指定された場合、半径アクセサを指定された数値または関数に設定し、各ノードの半径アクセサを再評価し、この力を返します。radiusが指定されていない場合、現在の半径アクセサを返します。これはデフォルトで次のようになります。
function radius() {
return 1;
}
半径アクセサは、シミュレーション内の各ノードに対して、nodeとその0ベースのindexを渡されて呼び出されます。結果の数値は内部に格納され、各ノードの半径は、力が初期化されたとき、またはこのメソッドが新しいradiusで呼び出されたときにのみ再計算され、力の適用ごとには再計算されません。
collide.strength(strength)
ソース · strengthが指定された場合、力の強度を指定された範囲[0,1]の数値に設定し、この力を返します。strengthが指定されていない場合、デフォルトで1である現在の強度を返します。
重なり合うノードは、反復緩和によって解決されます。各ノードについて、次のティックで重なると予想される他のノード(予想される位置⟨x + vx,y + vy⟩を使用)が決定されます。次に、ノードの速度は、各重なり合うノードからノードを押し出すように変更されます。速度の変化は、力の強度によって減衰され、同時的な重なりの解決がブレンドされ、安定した解決策が見つかるようにします。
collide.iterations(iterations)
ソース · iterationsが指定された場合、アプリケーションごとの反復回数を指定された数値に設定し、この力を返します。iterationsが指定されていない場合、デフォルトで1である現在の反復回数を返します。反復回数を増やすと、制約の剛性が大幅に向上し、ノードの部分的な重なりが回避されますが、力の評価にかかる実行時コストも増加します。