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

问题描述 投票:0回答:2

我有2 Points通过线,起点和终点连接。

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

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

java javascript gwt canvas
2个回答
1
投票

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

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

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

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


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));
}
© www.soinside.com 2019 - 2024. All rights reserved.