我有2个Points
由一条线,起点和终点连接。
我想在它们之间画一条弧,但半径应该是动态的,具体取决于用户点击的位置。因此,我有一个鼠标的第3个点,有XY坐标。
如何绘制ctx.arcTo()
以便生成的线穿过特定点(鼠标点)?
答案 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