如何用3个给定点计算arcTo()的半径?

时间:2013-04-12 16:30:45

标签: java javascript gwt canvas

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

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

如何绘制ctx.arcTo()以便生成的线穿过特定点(鼠标点)?

2 个答案:

答案 0 :(得分:2)

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

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

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

计算C点与该中心点之间的距离。这是半径。

答案 1 :(得分: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