使用D3.js力时,如何防止气泡接触svg框架/边界



我正在使用D3.js库来开发气泡图。我从互联网上得到了一些样本,使用力模拟来显示气泡节点。我非常喜欢它,并考虑将其包含在我的项目中,但有时会出现气泡被周围的SVG框架/边框切割的问题。我试着理解和调试代码,得出的结论是气泡的最终位置是由力模拟决定的。我想到了以下两种解决方案:

  1. 将气泡限制在指定区域内(实际SVG帧大小可以更大(
  2. 基于D3力模拟导致气泡占据的区域,预先定义框架的大小(宽度/高度(。换句话说,确定将通过力模拟计算的区域,然后定义SVG宽度/高度

有没有办法实现我提到的两个解决方案之一?是否有其他解决方案可以防止力模拟气泡不接触SVG框架/边界?

第二种方法是不可行的,因为力模拟过于非线性和不可预测,无法预先确定其作用区域。此外,根据作用的力,节点可以无限期地排斥自己,因此在模拟过程中扩展SVG可以创建一个不断扩展的SVG元素。

第一种方法是要走的路。要限制气泡,您可以编辑更新位置的函数(在示例中通常称为ticked(((,并使用Math.min((Math.max((手动添加边界:

以下代码是此示例的片段:

function tick() {
node
.attr("cx", function(d) { return d.x = Math.max(radius, Math.min(width - radius, 
d.x)); })
.attr("cy", function(d) { return d.y = Math.max(radius, Math.min(height - radius, 
d.y)); });
}

需要注意的事项:

  1. 记住要考虑气泡的半径,这样它就可以与边界相切。

  2. 请注意,代码不仅返回有限值,还将其指定给d.x和d.y。这是必要的,因为模拟使用d.x和d.y的当前值来计算模拟的下一帧。

最新更新