求线段于圆弧的交点

线段(有限长)和圆弧(非整圆)的求交点可以分为以下3部分进行:

设线段 ll 两端分别为 AABB,设圆 OO 的圆心为 CC,半径为 rr

一、求直线是否和正圆相交

这一部方法有两种,一种是通过三角形面积来计算,有:

AB×AC=nAB|AB \times AC| = n|AB|

nn 为直线 ABAB 到圆心的最短距离(亦是垂直距离)。

另一种是求出圆心在直线 ABAB 上的投影点,再算出距离。设点 OO 为圆心在直线 ABAB 上的投影点,有:

ABACABAB=AOAB\frac{AB \cdot AC}{AB \cdot AB} = \frac{|AO|}{|AB|}

简化一下,有:

f=ABACABABf = \frac{AB \cdot AC}{AB \cdot AB}

O=A+fABO = A + fAB

求出点 OO 后,可以直接通过距离的平方进行比较,无需开方。

这里通过第二种方法进行求解,因为接下来比较方便

二、 求直线与正圆的交点

承接上面第二种方法,设 PPQQ 分别为直线 ll 与圆 OO 的交点(仅有有一个交点时计算方法相同,不做特别讨论)。则有:

OP2=OQ2=r2OC2|OP|^2 = |OQ|^2 = r^2 - |OC|^2

k=OPABk = \frac{|OP|}{|AB|}

Q,P=A+(f±k)ABQ,P = A + (f \pm k)AB

可以通过 0(f±k)10 \leq (f \pm k) \leq 1 来快速判断点 PPQQ 是否位于线段 ABAB 上。

三、 求位于线段的交点是否在圆弧的方位内

设圆弧 arcarc 以点 CC 为圆心,半径为 rr,起始角为 startstart,转动角度为 sweepsweep。则求出交点 PPQQ 是否在圆弧的范围内。这一部分更多的是程序上的判断。

起始角为 startstart,转动角度为 sweepsweep 可以分为四种情况

最终圆弧 arcarc02π0-2\pi 内可以用一部分或两部分来表示,例如当 start=60°,sweep=120°start = 60°, \quad sweep = -120° 时,圆弧 arcarc 所在的范围为 [0°,60°],[300°,360°][0°,60°],[300°,360°]

通过 arctan(PC),arctan(QC)arctan(PC),arctan(QC)就能判断出交点是否在圆弧 arcarc