【问题标题】:D3 curved link with arrow not appearing on screen带箭头的 D3 弯曲链接未出现在屏幕上
【发布时间】:2018-07-17 10:21:58
【问题描述】:

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

添加 2 个节点(Add Node 按钮)并从选择框中选择源节点和目标节点后,当我按下 Add Link 按钮时,它不会显示链接,但是,节点会在屏幕上重新调整,给出一个认为已创建链接。

我添加了以下代码(包括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;    });

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    这是因为您实际上并没有创建任何对象来更改其属性,而是在实际创建任何链接之前尝试在文件顶部创建强制链接的路径。您需要根据“重启”功能中的链接创建路径,然后在“勾选”功能中更新它们的属性。这是一个代码笔: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' 属性会自动生成另一个箭头副本。很整洁!

    【讨论】:

    • 感谢@REEE;是否可以在同一代码中的链接中添加箭头?
    • 没问题,应该可以的,我现在看看。我在工作时可能需要 20-30 分钟。
    • @nyi 刚刚在codepen中添加了箭头的代码和上面的答案。希望有帮助。顺便说一句,现在看起来好多了,节点上的图像很漂亮!
    • 非常感谢@REEE。我的目标是将html页面连接到发送添加/删除节点/链接信息的WebSocket,目前,我正在尝试通过html/javascript函数来模拟它。
    猜你喜欢
    • 2019-02-20
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2016-08-26
    • 2017-01-25
    • 2017-11-15
    相关资源
    最近更新 更多