线段(有限长)和圆弧(非整圆)的求交点可以分为以下3部分进行:
设线段 l 两端分别为 A、B,设圆 O 的圆心为 C,半径为 r。
一、求直线是否和正圆相交
这一部方法有两种,一种是通过三角形面积来计算,有:
∣AB×AC∣=n∣AB∣
n 为直线 AB 到圆心的最短距离(亦是垂直距离)。
另一种是求出圆心在直线 AB 上的投影点,再算出距离。设点 O 为圆心在直线 AB 上的投影点,有:
AB⋅ABAB⋅AC=∣AB∣∣AO∣
简化一下,有:
f=AB⋅ABAB⋅AC
O=A+fAB
求出点 O 后,可以直接通过距离的平方进行比较,无需开方。
这里通过第二种方法进行求解,因为接下来比较方便
二、 求直线与正圆的交点
承接上面第二种方法,设 P,Q 分别为直线 l 与圆 O 的交点(仅有有一个交点时计算方法相同,不做特别讨论)。则有:
∣OP∣2=∣OQ∣2=r2−∣OC∣2
k=∣AB∣∣OP∣
Q,P=A+(f±k)AB
可以通过 0≤(f±k)≤1 来快速判断点 P,Q 是否位于线段 AB 上。
三、 求位于线段的交点是否在圆弧的方位内
设圆弧 arc 以点 C 为圆心,半径为 r,起始角为 start,转动角度为 sweep。则求出交点 P,Q 是否在圆弧的范围内。这一部分更多的是程序上的判断。
起始角为 start,转动角度为 sweep 可以分为四种情况
最终圆弧 arc 在 0−2π 内可以用一部分或两部分来表示,例如当 start=60°,sweep=−120° 时,圆弧 arc 所在的范围为 [0°,60°],[300°,360°]。
通过 arctan(PC),arctan(QC)就能判断出交点是否在圆弧 arc 上