【发布时间】:2016-06-29 20:27:13
【问题描述】:
这是我的第一个堆栈溢出问题,所以如果我犯了一些新手错误,请多多包涵。我在这里搜索了很多问题,并没有找到我正在寻找的确切内容(在一种情况下我有,但不知道如何实现它)。似乎只有问过类似问题的人没有得到任何答案。
我已经使用 D3 创建了一个强制布局,并且事情几乎按照我希望的方式工作。我无法编辑的两件事:
1) 防止节点重叠:是的,我已经阅读并重新阅读了 Mike Bostock 的集群力布局代码。我不知道如何在我的代码中实现它而不会出现严重错误!我从教程中尝试了这段代码,但它把我的节点固定在一个角落里,并在画布上展开了链接:
var padding = 1, // separation between circles
radius=8;
function collide(alpha) {
var quadtree = d3.geom.quadtree(graph.nodes);
return function(d) {
var rb = 2*radius + padding,
nx1 = d.x - rb,
nx2 = d.x + rb,
ny1 = d.y - rb,
ny2 = d.y + rb;
quadtree.visit(function(quad, x1, y1, x2, y2) {
if (quad.point && (quad.point !== d)) {
var x = d.x - quad.point.x,
y = d.y - quad.point.y,
l = Math.sqrt(x * x + y * y);
if (l < rb) {
l = (l - rb) / l * alpha;
d.x -= x *= l;
d.y -= y *= l;
quad.point.x += x;
quad.point.y += y;
}
}
return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
});
};
}
您可以在我的 fiddle(下面链接)中看到对 tick 函数的添加被注释掉了。
2) 包装我的文本标签,使其适合节点。现在它们通过悬停扩展为节点的全名,但我最终会将其更改为工具提示(一旦我解决了这些问题,我会找出一个工具提示) - 现在我只想要原始的短名称包裹在节点内。我查看了this answer 和this answer (http://jsfiddle.net/Tmj7g/4/),但是当我尝试将其实现到我自己的代码中时,它没有响应或最终聚集了左上角的所有节点(??)。
非常感谢任何和所有输入,请随时在此处编辑我的小提琴:https://jsfiddle.net/lilyelle/496c2bmr/
我也知道我的所有语言都不是完全一致的,也不是编写 D3 代码的最简单方法 - 那是因为我已经从不同来源复制并拼接了很多东西,并且仍在尝试找出最好的方法为自己写这些东西。在这方面的任何建议也值得赞赏。
【问题讨论】:
标签: javascript d3.js force-layout