Math 节点间的并行链路
我有一个Webcola&d3svg图,其中包含节点和节点之间的链接。 直到今天,节点之间的链接可能是单向的,如果B连接到A,它只是单向链接。 今天我被告知我需要支持双向链接,这意味着A可以向B发送链接,B可以向A发送链接 现在我被数学和如何完成它所困扰,我使用我发现的一些算法来绘制链接,直到今天,我猜从节点的中心绘制链接,我需要像这样并行显示两个方向的链接: 以下是我用来计算链接位置的算法:Math 节点间的并行链路,math,d3.js,webcola,Math,D3.js,Webcola,我有一个Webcola&d3svg图,其中包含节点和节点之间的链接。 直到今天,节点之间的链接可能是单向的,如果B连接到A,它只是单向链接。 今天我被告知我需要支持双向链接,这意味着A可以向B发送链接,B可以向A发送链接 现在我被数学和如何完成它所困扰,我使用我发现的一些算法来绘制链接,直到今天,我猜从节点的中心绘制链接,我需要像这样并行显示两个方向的链接: 以下是我用来计算链接位置的算法: let parent = connection.parent; const sx
let parent = connection.parent;
const sx = parent.source.x;
const sy = parent.source.y;
const tx = parent.target.x;
const ty = parent.target.y;
let angle = Math.atan2(ty - sy, tx - sx);
const radiusSource = parent.source.radius;
const radiusTarget = parent.target.radius;
let x1 = sx + Math.cos(angle) * radiusSource;
let x2 = tx - Math.cos(angle) * radiusTarget;
let y1 = sy + Math.sin(angle) * radiusSource;
let y2 = ty - Math.sin(angle) * radiusTarget;
angle = angle * 180 / Math.PI;
let opposite = Math.abs(angle) > 90;
if (opposite)
angle -= 180;
connection.coords = [x1, y1, x2, y2, angle, opposite];
return connection.coords;
这是函数的一部分,其结果进入路径的“d”属性,如下所示:
.attr('d', `M${x1} ${y1} L ${x2} ${y2}`)
现在双向链接的结果是它们相互覆盖,有人能帮我改进这个算法,使双向链接平行吗?更新:链接的位置需要通过考虑偏移的新弧度计算,如:
let parent = connection.parent;
const sx = parent.source.x;
const sy = parent.source.y;
const tx = parent.target.x;
const ty = parent.target.y;
const radiusSource = parent.source.radius;
const radiusTarget = parent.target.radius;
let radian = Math.atan2(ty - sy, tx - sx);
let offset = 0.1 // Offset ratio of radian, can be adjusted
let offsetRadian;
let angle = radian * 180 / Math.PI;
let opposite = Math.abs(angle) > 90;
if (opposite) {
angle -= 180;
offsetRadian = radian * (1 + offset);
} else {
offsetRadian = radian * (1 - offset);
}
let x1 = sx + Math.cos(offsetRadian) * radiusSource;
let y1 = sy + Math.sin(offsetRadian) * radiusSource;
let x2 = tx - Math.sin(offsetRadian) * radiusTarget;
let y2 = ty - Math.cos(offsetRadian) * radiusTarget;
connection.coords = [x1, y1, x2, y2, angle, opposite];
return connection.coords;
这真的使它们并行,看起来很像我已经管理过的东西,问题是链接不够长,看起来它与节点之间有一个余量。发生这种情况是因为他的大小是从节点的中间计算出来的,而不是从这个点计算出来的:链接的位置是由节点的位置计算出来的。这是关于几何关系的。你能发布整个函数吗?当然。该函数是根据OP修改的。请注意x2和y2使用正弦和余弦。