D3在直线边缘和多个曲线边缘之间切换
我有一个D3力量图,与this example中的力量图类似,只是一对节点节点之间可以有多于2个边。我希望能够在可视化所有边缘和仅仅一条直线边缘之间进行切换。我已经通过简单地改变边缘的可见性(隐藏或可见)来实现这一点,但是节点之间存在如此多的边缘以至于存在可见的滞后。D3在直线边缘和多个曲线边缘之间切换
我的想法是解决这个问题,只能在直边上运行力模拟,而不是包括所有的曲边。这会将边缘限制为每对节点的一个边缘,从而使得力仿真算法不那么紧密。
是否有可能做到这一点,同时仍然能够渲染未在强制算法中使用的弯曲边缘?
回答:
看起来最大的计算boggleneck实际上出现在.on("tick", tickActions)
步骤中,当代码计算如何绘制所有路径时,即使是不可见的路径。
对于任何人的兴趣,我改变了tick actions
功能绘制边缘或在此之前首先检查type
变量:
function tickActions() { // plot the curved links
link.attr("d", function(d) {
if (d.type != draw_type) return null;
// code to draw paths
});
}
通过改变draw_type
变量,你可以决定哪些边真正得到计算,并得出。
除此之外,您还需要忽略某些边缘的强度。我知道,我想被间隔仅基于直边我的图形,所以我做了simulation.force('link', link_force)
属性如下:
var link_force = d3.forceLink() // code for .id and .distance attributes
// return 0 for all non
.strength(function(d) {
if (d.type != 'straight') return 0;
return 0.3;
});
通过将所有非直线边缘的强度为0,力算法在间隔节点时基本上忽略它们。
最后,我添加了一个restart_network()
函数,它更新图形。可以使用这个函数来改变图中看到的实际链接数据,但我也决定包含其他更改。
function restart_network() { simulation.force("link", link_force);
simulation.alpha(1).restart();
}
以上是 D3在直线边缘和多个曲线边缘之间切换 的全部内容, 来源链接: utcz.com/qa/267069.html