javascript - d3强制布局节点中的链接位置

标签 javascript svg d3.js force-layout

我已经阅读了几个关于 d3 force layout 的问题,但我还没有找到我的答案,所以我发布了这个。

我正在使用 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);

可以查看完整代码here

我不明白如何更改图表的链接(或边缘)进入每个节点的位置。

例如:我希望从矩形节点出来的边位于矩形的中心,而不是左上角(我猜是位置 0,0)。 我现在肯定有一些与 SVG 中每个形状的 CX 和 CY 相关的东西,但它超出了我的理解范围。

我希望我的问题很清楚,随时问任何我可能遗漏的问题

谢谢!

最佳答案

只需将形状的中心作为原点即可,而不是将矩形定义为

   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,这样就更简单了。您可以对其他形状执行相同的操作。

关于javascript - d3强制布局节点中的链接位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24163190/

相关文章:

d3.js - 传单.js : too slow with custom svg markers (and a lot of points)

javascript - 我的 pdf 文件一开始未被选中,仅在 Internet Explorer 中被选中

javascript - 使用此特定代码从另一个数组中删除一个数组

javascript - 类型错误 : UserSchema is not a constructor (Schema is not a constructor MongoDB)

javascript - 想要通过浏览器使静态 SVG 绘图(来自 matplotlib)具有交互性

javascript - 在 v5 中扩展 d3.selection——这是正确的做法吗?

javascript - jQuery 触发元素的事件

SVG:基于文本的动态大小,合并对象

javascript - 使用 React Native 创建平面图

javascript - 如何在 d3.js 中生成小倍数