SVG绘制两个矩形之间的连接线

Kor*_*son 5 javascript connection svg rectangles

我目前在编程图编辑器javascriptSVG

我陷入与矩形之间的连接有关的问题。我发现了很多资源可以在圆之间绘制连接,但矩形却一无所获。

所以现在我得到的是,我可以通过用鼠标拖动线在两个矩形之间绘制一条连接线,但是该连接显示在它们内部,因为我是从矩形的中点计算出连接的。

如您在下面的图片中看到的,我使自己有了一些想法,但是我没有走最后一步。

我只想绘制标记为红色的线。

我的问题的示例图片:我要画红线

稍后我要拖动矩形,并且应该更新该线,但是现在我只需要计算这条线即可。

有人有好的建议吗?

Pet*_*dge 6

假设您有两个矩形,并且知道它们的中心(cx1cy1)和(cx2cy2)。您还需要将宽度和高度除以2(即,从中心到侧面的距离):(w1h1)和(w2h2)。

它们之间的距离是:

var dx = cx2 - cx1;
var dy = cy2 - cy1;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下公式计算两个矩形的交点:

var p1 = getIntersection(dx, dy, cx1, cy1, w1, h1);
var p2 = getIntersection(-dx, -dy, cx2, cy2, w2, h2);
Run Code Online (Sandbox Code Playgroud)

哪里getIntersection是:

function getIntersection(dx, dy, cx, cy, w, h) {
  if (Math.abs(dy / dx) < h / w) {
    // Hit vertical edge of box1
    return [cx + (dx > 0 ? w : -w), cy + dy * w / Math.abs(dx)];
   } else {
    // Hit horizontal edge of box1
    return [cx + dx * h / Math.abs(dy), cy + (dy > 0 ? h : -h)];
    }
};
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

var dx = cx2 - cx1;
var dy = cy2 - cy1;
Run Code Online (Sandbox Code Playgroud)
var p1 = getIntersection(dx, dy, cx1, cy1, w1, h1);
var p2 = getIntersection(-dx, -dy, cx2, cy2, w2, h2);
Run Code Online (Sandbox Code Playgroud)
function getIntersection(dx, dy, cx, cy, w, h) {
  if (Math.abs(dy / dx) < h / w) {
    // Hit vertical edge of box1
    return [cx + (dx > 0 ? w : -w), cy + dy * w / Math.abs(dx)];
   } else {
    // Hit horizontal edge of box1
    return [cx + dx * h / Math.abs(dy), cy + (dy > 0 ? h : -h)];
    }
};
Run Code Online (Sandbox Code Playgroud)