即使沒有D3經驗,這也不應該太難實現。困難的部分是你需要檢查一下給定的座標是在燒瓶內部還是外部。假設存在這樣一個函數,比如isContained
,你需要做的唯一改變就是放置氣泡的tick
事件處理函數。
force.on("tick", function(e) {
var q = d3.geom.quadtree(nodes),
i = 0,
n = nodes.length;
while (++i < n) {
q.visit(collide(nodes[i]));
}
svg.selectAll("circle")
.filter(function(d) { return isContained(d.x, d.y); })
.attr("cx", function(d) { return d.x; })
.attr("cy", function(d) { return d.y; });
svg.selectAll("circle")
.filter(function(d) { return !isContained(d.x, d.y); })
.each(function(d) {
d.x = d3.select(this).attr("cx");
d.y = d3.select(this).attr("cy");
});
});
處理程序的第一部分是不變的,但在第二部分僅將仍然被包含(使用isContained
)將燒瓶內的那些圈的座標被更新。也就是說,任何將被移出燒瓶外的圓都保留在原處。
對於將不包含任何時間越長圓,由力佈局中設置的位置復位到前一個(其中圓圈示出)。
很好的例子,非常漂亮。 – VividD
很好的例子 - 它只是一個恥辱的代碼缺少一些註釋來解釋。 – Ian
v4有沒有例子?在此先感謝 –