“环形部件”是从环形上切出的部分。
每个“环部分”由一个中心点表示,然后是相对于该中心点的一些边界。
首先,内部和外部距离边界定义一个 2D 环,然后一对角度边界定义围绕该环的起点和终点。 (我以起始角和扫描角的形式指定角度边界,但具体采用什么形式并不那么重要。)
如何测试两个这样的“环形部分”之间的几何相交,同时保持测试代码尽可能简单和健壮?
我尝试了一种方法,首先检测环之间相交的各种情况(即最初忽略角度边界),然后检查相交部分是否落在角度边界内。我认为可能可以减少环相交部分所需的信息以达到角度范围,但我认为这并不适用于所有情况。
我还考虑了沿着另一个环的径向边界线切割(或剪裁)一个环部分的第一步。我认为这可能是一种合理的方法,但是剪切本身具有弯曲边缘的形状开始变得有点复杂。
要测试两个环形扇区的交集,您需要检查 1) 它们的半径间隔是否相交以及 2) 它们的角度间隔是否相交
令环扇区由内半径和外半径
ri, ro
、起始角 astart
和扫描角 sw
定义:
沿半径的交点:
not (ri1>ro2 or ri2>ro1)
equivalent:
(ri1<=ro2 and ri2<=ro1)
角度间隔相交更复杂,因为我们应该考虑周期性。让我们找到中间角
ma
和半扫描的余弦cd
(余弦的使用解决了周期性、不同弧方向等问题)
ma = astart + sw/2
cd = Cos(sw/2)
那么角间隔相交如果
Cos(ma1 - astart2) >= cd1 or
Cos(ma1 - astart2 - sw2) >= cd1 or
Cos(ma2 - astart1) >= cd2 or
Cos(ma2 - astart1 - sw1) >= cd2