Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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 如何在force layout D3.js中生成指向右侧的链接_Javascript_Svg_D3.js - Fatal编程技术网

Javascript 如何在force layout D3.js中生成指向右侧的链接

Javascript 如何在force layout D3.js中生成指向右侧的链接,javascript,svg,d3.js,Javascript,Svg,D3.js,如何在force layout D3.js中生成指向右侧的链接弧角,如图所示: 我尝试了以下方法: path.attr("d", function(d) { var x1 = d.source.x, y1 = d.source.y, x2 = d.target.x, y2 = d.target.y, dx = x2 - x1, dy = y2 - y1, if (x1 === x2) {

如何在force layout D3.js中生成指向右侧的链接弧角,如图所示:

我尝试了以下方法:

path.attr("d", function(d) {

    var x1 = d.source.x,
        y1 = d.source.y,
        x2 = d.target.x,
        y2 = d.target.y,
        dx = x2 - x1,
        dy = y2 - y1,

    if (x1 === x2) {

        dr = Math.sqrt(dx * dy + dy * dy);
        return "M" +
            d.source.x + "," +
            d.source.y + "A" +
            dr + "," + dr + " 0 0,1 " +
            d.target.x + "," +
            d.target.y;

    }
});

但似乎有些在左边,有些在右边。请帮我解决这个问题。

您总是将
扫描标志设置为1,因此它将从(x1,y1)顺时针绘制到(x2,y2)。向下时,它将位于右侧,向上时,它将位于左侧。通过检查方向是向上还是向下,然后交换点的顺序或反转扫描方向,可以对此进行规格化:

if (x1 === x2) {
    var dr = Math.sqrt(dx * dy + dy * dy); // note that this is always equal to Math.abs(dy)
    var sweep = 0;
    if (y1 > y2) {
        sweep = 1
    }
    return "M" +
        d.source.x + "," d.source.y +
        "A" + dr + "," + dr +
        " 0 0," + sweep + " " +
        d.target.x + "," + d.target.y;
}

谢谢你Phssthpok。它工作,但我的条件是,当(x1==x2)在同一方向时,我必须使链接弯曲:(保留(x1==x2)比较。之后为y值添加额外的比较:(它不起作用。一些链接向右弯曲,一些在左侧。啊,它看起来像是指定绘制圆弧的正确方法,另一个方向是使用
扫描标志,而不是
x轴旋转。是否可以在每个链接之间添加一些距离,如上图所示?如果(x1==x2){var dr=Math.sqrt(dx*dy+dy*dy);//注意,这始终等于Math.abs(dy)var sweep=1;如果(y1>y2){sweep=0}返回“M”+d.source.x+,“+d.source.y+”A”+dr+,“+dr+”0,“+sweep+”+d.target.x+,“+d.target.y;}