javascript - D3 弯曲链接,箭头未出现在屏幕上

标签 javascript d3.js

我正在尝试按照此 d3noob's block 添加带有箭头的弯曲链接给我的codepen .

添加 2 个节点(添加节点 按钮)并从选择框中选择源节点和目标节点后,当我按添加链接 按钮时,它不会显示但是,节点会在屏幕上重新调整,从而表明已创建链接。

我添加了以下代码(包括codepen中的一些变量定义)

path.attr("d", function(d) {
    var dx = d.target.x - d.source.x,
        dy = d.target.y - d.source.y,
        dr = Math.sqrt(dx * dx + dy * dy);
    return "M" + 
        d.source.x + "," + 
        d.source.y + "A" + 
        dr + "," + dr + " 0 0,1 " + 
        d.target.x + "," + 
        d.target.y;
});

这是早些时候:

link.attr("x1", function(d) { return d.source.x;    })
.attr("y1", function(d) {   return d.source.y;    })
.attr("x2", function(d) {   return d.target.x;    })
.attr("y2", function(d) {   return d.target.y;    });

最佳答案

这是因为您实际上尚未创建任何对象来更改其属性,因此在实际创建任何链接之前,您尝试在文件顶部创建强制链接的路径。您需要根据“重新启动”函数中的链接创建路径,然后在“勾选”函数中更新它们的属性。这是一个代码笔:https://codepen.io/anon/pen/RBazVp?editors=0010

以下是相关更改:

function restart() {
       ...
       ...
  link = link.data(links);
  link.enter()
      .append('path')
      .attr('class', 'link');
  link.exit().remove();

  force.start();
       ...
       ...
}

function tick() {
  link.attr("d", function(d) {
    var dx = d.target.x - d.source.x,
        dy = d.target.y - d.source.y,
        dr = Math.sqrt(dx * dx + dy * dy);
    return (
      "M" +
      d.source.x +
      "," +
      d.source.y +
      "A" +
      dr +
      "," +
      dr +
      " 0 0,1 " +
      d.target.x +
      "," +
      d.target.y
    );
  });
       ...
       ...
}

要向链接添加箭头:

var arrows = svg.append("defs")
            .selectAll("marker")
              .data(["arrow"])
              .enter()
              .append("marker")
                .attr("id", String)
                .attr("viewBox", "0 -5 10 10")
                .attr("refX", 15)
                .attr("refY", -1.5)
                .attr("markerWidth", 6)
                .attr("markerHeight", 6)
                .attr("orient", "auto")
                .append("path")
                  .attr("d", "M0,-5L10,0L0,5");

function restart() {
       ...
       ...
  link = link.data(links);
  link.enter()
      .append('path')
      .attr('class', 'link')
      .attr('marker-end', 'url(#arrow)');  
  link.exit().remove();

  force.start();
       ...
       ...
}

有趣的是,您只需要定义和创建箭头一次,并且更改“marker-end”属性将自动生成箭头的另一个副本。非常整洁!

关于javascript - D3 弯曲链接,箭头未出现在屏幕上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51378977/

相关文章:

javascript - jQuery:选择 `<td>` 中除特定 `<tr>` 之外的所有 `<td>`

javascript - 我的引导模式不工作

javascript - 在 JavaScript/jQuery 中多次调用带有参数的函数的简写?

svg - 如何获得笔划的轮廓?

javascript - d3js图表点和区域不更新

d3.js - 标准的 d3 工作流程和托管解决方案

javascript - 使用 Cubism 的历史数据

Javascript 输入框按字符顺序搜索过滤器

javascript - 将 javascript 对象分成具有点击事件中的 4 个项目的组

javascript - D3 JS - 使用硬编码边界框属性制作多边形可拖动不起作用