即使没有 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
)。也就是说,任何将移出烧瓶的圆圈都保留在原处。
对于不再包含的圆圈,力布局设置的位置重置为前一个(绘制圆圈的位置)。