我有 2 个Points
由一条线连接,起点和终点。
我想在它们之间画一条弧线,但半径应该是动态的,具体取决于用户点击的位置。因此,我有一个来自鼠标的第三个点,带有 XY 坐标。
如何绘制一个ctx.arcTo()
使结果线穿过特定点(鼠标点)?
我有 2 个Points
由一条线连接,起点和终点。
我想在它们之间画一条弧线,但半径应该是动态的,具体取决于用户点击的位置。因此,我有一个来自鼠标的第三个点,带有 XY 坐标。
如何绘制一个ctx.arcTo()
使结果线穿过特定点(鼠标点)?
更新:这个答案实际上是不正确的,请忽略它。圆弧的圆心不一定在 A 和 B 之间的中点。
假设两个点是 A 和 B,用户动态提供 C 点。
找到 A 和 B 之间的中点。这将是圆的中心。从中心到点 C 的线将是弧的半径。
计算 A 和 B 之间的中点(圆心)的坐标。
计算点 C 到这个中心点的距离。这是半径。
计算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