我一直在阅读有关d3力布局的几个问题,但是我还没有找到答案,所以我将其发布。
我正在使用D3库,特别是力设计。我没有为节点添加预定义的形状,而是创建了自己的形状,例如圆形,矩形等。
var shapes = {
star : "m 0 0 l 23 12 l -4 -26 l 19 -19 l -27 -4 l -11 -23 l -12 23 l -27 4 l 19 19 l -4 26 l 24 -12",
rect : "M 0 0 L 0 "+ rect_size + "L "+ 2 * rect_size + " "+ rect_size + " L "+ 2 * rect_size + " 0 L 0 0",
vertical_rect : "M 0 0 L 0 "+ 2 * rect_size + "L "+ rect_size + " "+ 2 * rect_size + " L "+ rect_size + " 0 L 0 0",
circle: "M 0 0 A "+ radius + " " + radius +" 0 1 0 0.00001 0 Z"
};
var dummy_nodes = {};
var dummy_shapes = {"A" : shapes.circle, "B" : shapes.rect, "C" : shapes.rect, "D" : shapes.circle};
// Compute the distinct nodes from the links.
links.forEach(function (link) {
link.source = dummy_nodes[link.source] || (dummy_nodes[link.source] =
{ name: link.source, shape: dummy_shapes[link.source]});
link.target = dummy_nodes[link.target] || (dummy_nodes[link.target] =
{ name: link.target,shape: dummy_shapes[link.target]});
});
var force = d3.layout.force()
.nodes(d3.values(dummy_nodes))
.links(links)
.size([960, 500])
.linkDistance(200)
.charge(-1500)
.on("tick", tick)
.start();
var svg = d3.select("body").append("svg:svg")
.attr("width", w)
.attr("height", h);
var node = svg.append("svg:g").selectAll(".node")
.data(force.nodes())
.enter().append("path")
.attr("class", "node")
.attr("d", function(n){ return n.shape})
.on("dblclick", dblclick)
.call(drag);
您可以在此处查看整个代码
我不明白如何更改图的链接(或边)进入每个节点的位置。
例如:我希望从矩形节点出来的边缘位于矩形的中心,而不是左上角(我猜是位置0,0)。我现在肯定有一些与SVG中每种形状的CX和CY相关的东西,但这是我无法掌握的。
我希望我的问题很清楚,随时问我可能遗漏的任何问题
谢谢!
只需将形状的中心作为原点即可,而不是将rect定义为
rect : "M 0 0 L 0 "+ rect_size + "L "+ 2 * rect_size + " "+ rect_size + " L "+ 2 * rect_size + " 0 L 0 0",
定义为
rect : "M " + -rect_size + " " + (-rect_size / 2) + " h " + 2 * rect_size + " v " + rect_size + " h "+ (-2 * rect_size) + " z",
我已经从L切换到h,v和z,因此更简单。您可以对其他形状执行相同的操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句