Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript D3力布局:链接用直线代替曲线(但仅适用于某些链接)_Javascript_Svg_D3.js_Force Layout - Fatal编程技术网

Javascript D3力布局:链接用直线代替曲线(但仅适用于某些链接)

Javascript D3力布局:链接用直线代替曲线(但仅适用于某些链接),javascript,svg,d3.js,force-layout,Javascript,Svg,D3.js,Force Layout,我有一个D3,它生成以下图表: 这张图唯一让我感到困扰的是,如果两个节点之间只有一个链接,它将被绘制为曲线。我认为如果这些链接只是直线的话会更好(箭头就可以了)。假设微软和亚马逊之间应该是一条直线(带箭头)。甲骨文和谷歌、索尼和LG等公司的情况也一样 如何做到这一点?这很容易。在linkArc(d)方法中,如果只有1个子项,只需将dr参数设置为0,如果有更多子项,则将其设置为默认值。这样,节点之间就不会有任何曲线 不过,第一步将是确定有多少邻居。一种简单的方法是,在从链接定义节点之后,如下所示

我有一个
D3
,它生成以下图表:

这张图唯一让我感到困扰的是,如果两个节点之间只有一个链接,它将被绘制为曲线。我认为如果这些链接只是直线的话会更好(箭头就可以了)。假设微软和亚马逊之间应该是一条直线(带箭头)。甲骨文和谷歌、索尼和LG等公司的情况也一样


如何做到这一点?

这很容易。在
linkArc(d)
方法中,如果只有1个子项,只需将
dr
参数设置为0,如果有更多子项,则将其设置为默认值。这样,节点之间就不会有任何曲线

不过,第一步将是确定有多少邻居。一种简单的方法是,在从链接定义节点之后,如下所示,尽管这不是最佳方法

links.forEach(function(d) {
    if (nodes[d.source.name].children==undefined) {
        nodes[d.source.name].children=0;
    }
    nodes[d.source.name].children++
});
完成此操作后,可以按如下方式调整直线的曲线:

function linkArc(d) {
  var dx = d.target.x - d.source.x,
      dy = d.target.y - d.source.y,
      dr = (nodes[d.target.name].children>1 & nodes[d.source.name].children>1)?Math.sqrt(dx * dx + dy * dy):0;
  return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y;
}
结果如下:

我确信有更好的方法来解决这个问题,但这只是一个开始。
希望这有帮助。

这是基于@Nikos的答案:

links.forEach(function(d) {
    d.straight = 1;
    links.forEach(function(d1) {
        if ((d.source == d1.target) && (d1.source == d.target))
            d.straight = 0;
    });
});

屈服于正确的图表:(关于连接的平直度)


谢谢,但是如果节点之间有多个连接,我需要保留曲线。您的解决方案似乎会使所有链接都成直线。抱歉,从问题中不清楚只有一对时您才喜欢直线。没问题,我给+1,因为如果其他人需要这些东西,您的答案可能会有用,请保留答案。我做了一点实验,找到了解决这个问题的方法。你现在能看一看是不是更好?现在没有时间,但我会回来看一看,谢谢!感谢您发布解决方案!您可以选择正确的答案,我这边没有问题:)
function linkArc(d) {
  var dx = d.target.x - d.source.x,
      dy = d.target.y - d.source.y,
      dr = (d.straight == 0)?Math.sqrt(dx * dx + dy * dy):0;
  return "M" + d.source.x + "," + d.source.y +
      "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y;
}