Cola.js + d3.js强制定向网络 - 在强制解算器运行期间/之后约束节点

时间:2014-09-15 20:39:28

标签: svg d3.js hierarchy

我使用Cola.js和d3.js创建一个力导向的层状图。使用Y约束将节点堆叠在行上,我已根据层次结构中给定节点的最大深度预先计算了这些约束。

使用Cola.js还有一种很好的方法可以将节点与强制解算器一起约束到列吗?我希望将节点居中于Y周围,但也使用力求解器的定位来计算最短边距,从而最大限度地减少边缘交叉。

目标是让情节拖得更少"柔软,"因此,在强制求解器定位之后/期间,节点应该被约束到列。下面提供的小提琴效果很好,但是对于非常大的网络,网络的整体惯性很高,因此拖动单个节点不会像我想的那样快速地移动整个网络。

如果有办法加强力求解器,那么拖动节点会快速移动整个网络,这可能会起作用,而不是使用X偏移约束。可乐试图通过消除d3所具有的一些力选项(例如电荷和重力)来简化节点求解器,因此我不能使用这些(?)来拖动网络速度更快。

由于Cola在运行求解器之前将约束作为参数,因此在保留最佳节点定位的同时设置约束是困难的。

...(示例代码太大而无法粘贴)

d3cola
    .nodes(graph.nodes)
    .links(graph.relationships)
    .constraints(graph.constraints)
    .symmetricDiffLinkLengths(30)
    .start(5,10,20);

...

小提琴:http://jsfiddle.net/k54ohxor/1/

可乐对齐示例:http://marvl.infotech.monash.edu/webcola/examples/alignment.html

screenshot

在上面的示例屏幕截图中,查看层次结构的深度级别3,您可以看到,如果我按照它们从数据库进入的顺序预先约束节点,那将导致节点定位不良和不需要的边缘交叉,因为节点ID的顺序为7,6,9,8

由于

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望能够在网络中拖动节点并让整个网络跟随而没有任何弹性?

您可以做的一件事是创建一对对齐约束(x和y),以保留从初始布局中出来的节点之间的相对水平和垂直分隔。也就是说,使用第一次调用d3cola.start(5,10,20)的结果(增加传入的数字来控制初始布局的迭代次数)来确定随后添加的对齐约束的x和y偏移量

另一个问题是,如果您只是想将整个图形拖动到好像是一个严格的单个对象,为什么不只是允许在SVG中拖动父组而不是让cola这样做呢?你提到了列,所以也许你只想创建一个x对齐约束?