グリッド全体で等間隔にノードを配置する通常の「グリッド」を作成しました。次に、linkDistance をランダム化することで、グリッドを「かき立てる」ことができるので、規則性が低くなります。
すべてのエッジ ポイントが動かないように「固定」したいと思います。フォース レイアウトの影響を受けるのは内側のポイントだけです。
私の洞察では、これは通常の四角形グリッドであるため、重みが 4 未満のポイントは「エッジ」ポイントになるため、固定する必要があります。
ノードとリンクが強制レイアウトに追加された後にのみ重みが計算されると考えているためforEach
、配列を強制レイアウトに追加し、重みに基づいてnodes
条件付きでプロパティを設定した後、配列を調べています。fixed
次に、nodes
プロパティを再適用しstart
てシミュレーションを実行します。
ダメ。例では、すべてのポイントを移動します。
force = d3.layout.force()
.size( [w, h ] )
.nodes( nodes )
.links( links )
.linkDistance( function( d ){ return Math.random() * GRID_SPACING; } )
.linkStrength( 1 )
.charge( 0 )
.gravity( 0 )
.friction( .5 )
.on( "tick", function() {
d3links.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
d3nodes.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
} );
// "Pin" all the edge nodes.
nodes.forEach( function( node ){
if ( node.weight < 4 ){
node.fixed = true;
}
} );
force.nodes( nodes ).start();