我认为这可行,但我还没有彻底测试过。您有 2 条弧,每条弧都有一个起始角和一个终止角。正如您所做的那样,我将从北向顺时针测量的度数进行计算,但与数学家一样,从东向逆时针测量的弧度进行计算也同样容易。
首先“标准化”你的弧,也就是说,减少它们中的所有角度[0,360)
,因此取出 360deg 的倍数并使所有角度为 +ve。确保每个圆弧的终止角位于起始角的顺时针方向。
接下来,选择一个弧线的起始角度,无论是哪一个都没关系。将您拥有的所有角度(其中 4 个)按数字顺序排序。如果任何角度在数值上小于您选择的起始角度,请为其添加 360 度。
将角度重新排序为递增的数字顺序。您选择的起始角度将成为新列表中的第一个元素。从您已经选择的起始角度开始,列表中的下一个角度是什么?
1) 如果是同一弧的终止角,则要么没有重叠,要么该弧完全包含在另一弧内。记下并找到下一个角度。如果下一个角度是另一条弧的起始角度,则没有重叠,可以停止;如果它是另一条弧的停止角,则重叠包含整个第一条弧。停止
2) 如果它是另一条弧的起始角度,则重叠从该角度开始。记下这个角度。扫描遇到的下一个角度必须是停止角,重叠在那里结束。停止。
3) 如果是另一个圆弧的终止角度,则重叠包括第一个圆弧的起始角度与该角度之间的角度。停止。
这不是特别优雅,并且比我通常喜欢的更依赖 if,但它应该可以工作并且相对容易翻译成您最喜欢的编程语言。
看,根本没有三角学!
EDIT
这是一种更“数学”的方法,因为您似乎觉得有必要。
对于角度 θ(-pi,pi]
双曲正弦函数(通常称为sinh
) 将角度映射到区间内实线上的区间(近似)(-11.5,11.5]
。不像arcsin
and arccos
该函数的反函数在同一区间上也是单值的。按着这些次序:
1)如果一条弧包含0,则将其分成2条弧,(start,0)
and (0,stop)
。现在,实线上有 2、3 或 4 个间隔。
2) 计算这些间隔的交集并将线性测量转换回角度测量。现在您已经有了两条弧线的交点。