1

我有 2 个Points由一条线连接,起点和终点。

我想在它们之间画一条弧线,但半径应该是动态的,具体取决于用户点击的位置。因此,我有一个来自鼠标的第三个点,带有 XY 坐标。

如何绘制一个ctx.arcTo()使结果线穿过特定点(鼠标点)?

4

2 回答 2

1

更新:这个答案实际上是不正确的,请忽略它。圆弧的圆心不一定在 A 和 B 之间的中点。

假设两个点是 A 和 B,用户动态提供 C 点。

找到 A 和 B 之间的中点。这将是圆的中心。从中心到点 C 的线将是弧的半径。

计算 A 和 B 之间的中点(圆心)的坐标。

计算点 C 到这个中心点的距离。这是半径。

于 2013-04-12T16:59:28.610 回答
0

计算A、B、C点随机定位的最大允许不包曲线半径(假设我们用arcTo从A到B经过C点的方法绘制。

//calculate distance between points and find the smallest one
 const dAC = distance(pointA, pointC);
 const dBC = distance(pointB, pointC);
//calculate angle between ACB (C is vertex)
 const anglePoints = findAngle(pointA, pointC, pointB);
// calculate radius
 const r = Math.ceil(Math.min(dAC, dBC) * Math.abs(Math.tan(anglePoints / 2)));
 ctxChart.arcTo(pointC.x, pointC.y, pointB.x, pointB.y, r);

function distance(p1: Point, p2: Point): number {
    const xDelta = (p2.x - p1.x);
    const yDelta = (p2.y - p1.y);
    const d = Math.sqrt(xDelta * xDelta + yDelta * yDelta);
    return d;
}

function findAngle(A: Point,B: Point,C: Point) {
    var AB = Math.sqrt(Math.pow(B.x-A.x,2)+ Math.pow(B.y-A.y,2));    
    var BC = Math.sqrt(Math.pow(B.x-C.x,2)+ Math.pow(B.y-C.y,2)); 
    var AC = Math.sqrt(Math.pow(C.x-A.x,2)+ Math.pow(C.y-A.y,2));
    return Math.acos((BC*BC+AB*AB-AC*AC)/(2*BC*AB));
}

有答案链接帮助我计算正确的半径值 https://math.stackexchange.com/questions/797828/calculate-center-of-circle-tangent-to-two-lines-in-space/797891#797891

于 2020-06-16T14:31:42.257 回答