algorithm - 使用圆心、半径和圆上的 3 个点计算圆弧上的点

标签 algorithm math geometry

给定圆心、半径和圆上的 3 个点,我想通过指定开始绘制的角度和数量来绘制一条从第一个点开始,经过第二个点,并在第三个点结束的圆弧。旋转的角度。为此,我需要计算弧上的点。我希望计算的点数是可变的,这样我就可以调整计算弧的精度。这意味着我可能需要一个循环,通过在计算出一个点后旋转一点来计算每个点。我已阅读此问题的答案 Draw arc with 2 points and center of the circle但它只解决了计算角度的问题,因为我不知道'canvas.drawArc'是如何实现的。

最佳答案

这个问题有两个部分:

  1. 如何找到两点之间经过第三点的弧?
  2. 如何在找到的弧上生成一组点?

让我们从第一部分开始。给定 (O, r) 圆上的三个点 ABC,我们想要找到圆弧位于通过 BAC 之间。为了找到弧的内角,我们需要计算 oriented angles ABAC 弧。如果 AB 的角度大于 AC,我们的方向就是错误的:

Va.x = A.x - O.x;
Va.y = A.y - O.y;
Vb.x = B.x - O.x;
Vb.y = B.y - O.y;
Vc.x = C.x - O.x;
Vc.y = C.y - O.y;

tb = orientedAngle(Va.x, Va.y, Vb.x, Vb.y);
tc = orientedAngle(Va.x, Va.y, Vc.x, Vc.y);

if tc<tb
    tc = tc - 2 * pi;
end


function t = orientedAngle(x1, y1, x2, y2)
    t = atan2(x1*y2 - y1*x2, x1*x2 + y1*y2);
    if t<0
        t = t + 2 * pi;
    end
end

现在是第二部分。你说:

I probably need a loop that calculates each point by rotating a little after it has calculated a point.

但问题是,有多少?由于圆的周长随着半径的增加而增加,因此无法以固定的角度达到固定的精度。换句话说,要绘制两条具有相同角度和不同半径的圆弧,我们需要不同数量的点。我们可以假设[几乎]恒定的是这些点之间的距离,或者我们绘制来模拟弧线的线段的长度:

segLen = someConstantLength;
arcLen = abs(tc)*r;
segNum = ceil(arcLen/segLen);
segAngle = tc / segNum;
t = atan2(Va.y, Va.x); 

for i from 0 to segNum
    P[i].x = O.x + r * cos(t);
    P[i].y = O.y + r * sin(t);
    t = t + segAngle;
end

注意,虽然在这个方法中AC肯定会被创建,但是点B不一定是创建的点之一。但是,该点与最近线段的距离会非常小。

enter image description here

关于algorithm - 使用圆心、半径和圆上的 3 个点计算圆弧上的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65550612/

相关文章:

java - 将 If-Else 语句转换为公式

c++ - 如何找到两个 vector 之间的角度?

c# - 在 .NET Compact 中模拟曲线图

algorithm - Dijkstra 具有负边。不理解这些示例,它们根据 CLRS 伪代码工作

algorithm - 编程逻辑 : Finding the smallest equation to a large number

c - 高效的 8 连接洪水填充

unity-game-engine - 每帧检查多个球之间碰撞的快速方法

python - 实现贝茨分布

javascript - 使用横滚,俯仰,偏航和长度确定新的GPS位置

javascript - 径向渐变