Javascript 如何在force layout D3.js中生成指向右侧的链接
如何在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) {
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;}