确定弧中点的算法

Algorithm for determine the Arc Mid Point

我目前正在寻求实现一种能够计算弧中点的算法。从现在开始,我将参考下图。已知的是起点和终点节点(分别为 A 和 B)、中心(C 点)和 P 点,即线 AB 和 CM 的交点(我可以在不知道点 M 的情况下找到这个点,因为线AB 垂直于线 CM,因此斜率为 -1/m)。我也知道圆弧的角度和圆弧的半径。我正在寻找 M 点。

我一直在寻找不同的来源。有些人建议将坐标转换为极坐标,从极坐标计算中点,然后恢复为笛卡尔坐标。这涉及到 sin 和 cos(和 arctan),我有点不愿意这样做,因为三角函数需要计算时间。

我一直在寻找直接计算点 M 的方法,方法是将圆弧视为圆并将 CP 线作为与圆相交于点 M 的线。然后我会得到两个值,最接近点 P 的值将是正确的交点。但是,这种方法,代数变得又长又复杂。然后我需要为 P = C 和 AB 线水平和垂直时创建特殊情况。这个方法没问题,但我想知道是否有更好的方法可以更简单地计算这一点?

此外,作为旁注,我将在 C++ 中创建此算法。

I would then get two values

这在代数上是不可避免的。

and the value closest to point P would be the correct intersection point.

仅当弧覆盖小于 180°。

Then I would need to create special cases for when P = C

这确实是最棘手的案例。如果A, B, C在一条直线上,不知道哪条弧是弧,也就答不上来。除非您有一些额外的信息可以开始,例如知道弧线从 AB 是逆时针方向。在这种情况下,您知道三角形 ABM 的方向,并且可以使用它来决定选择哪个 solition,而不是使用距离。

and for when the line AB is horizontal and vertical

将一条线表示为 ax + by + c = 0 并且您可以将所有斜率视为相同。这些是直线的齐次坐标,您可以计算它们,例如使用叉积 (a, b, c) = (Ax, Ay, 1) × (Bx, By, 1)。但是关于如何最好地计算这些线或将其与圆相交的更详细的问题可能应该去 Math Stack Exchange。

if there are any better methods out there that can compute this point that are simpler?

投影几何和齐次坐标可以避免很多讨厌的极端情况,例如无限半径的圆(也称为线)或平行线的交点。但是在两个解决方案之间做出决定的问题仍然存在,所以它可能不会让事情变得像你希望的那样简单。

极坐标形式的圆周表示为

x = Cx + R cos(alpha)
y = Cy + R sin(alpha)

其中 alpha 是从中心 C 到点 x,y 的角度。现在的目标是如何在没有三角函数的情况下得到alpha

弧中点M,线段AB中间的点S,以及你已经计算好的点P , 他们都具有相同的 alpha, 他们与 C.

在同一行

让我们将向量 vx,vy 作为 CS。同时计算它的长度:

vx = Sx - Cx = (Ax + Bx)/2 - Cx
vy = Sy - Cy = (Ay + By)/2 - Cy
leV = sqrt(vx * vx + vy * vy)

我更喜欢 S 而不是 P 因为我们可以避免一些问题,例如无限 CP 斜率或符号应用于斜率(朝向 M 或其逆)。

根据 sincos 的定义,我们知道:

sin(alpha) = vy / leV
cos(alpha) = vx / leV

最后我们得到

Mx = Cx + R * vx / leV
My = Cy + R * vy / leV

注意:要计算R你需要另一个sqrt函数,它不是很快,但比sin或cos快。
为了获得更好的准确性,请使用 Ra= dist(AC)Rb= dist(BC)

的平均值