第一关,每个角度都在其他两个角度之间,你真正要问的是:
对于给定的角度:a、b和g,g是否在a和b之间的反射角之外?
您可以继续将a定义为最左边的角度,将b定义为最右边的角度,或者您可以解决这个问题,例如,如果这些陈述中的任何一个为真,则a是您的最左边的角度:
- a ≤ b ∧ b - a ≤ π
- a > b ∧ a - b ≥ π
为简单起见,假设你最左边的角度是l,你最右边的角度是r,你试图找出g是否在它们之间。
这里的问题是看起来。我们正在寻找基本上 3 个积极的案例:
- l ≤ g ≤ r
- l ≤ g ∧ r < l
- g ≤ r ∧ r < l
如果您只是将 a 定义为最左侧,将b定义为最右侧,那么您就完成了,您的情况将如下所示:
a <= g && g <= b ||
a <= g && b < a ||
g <= b && b < a
但是,如果您计算了l和r,您会注意到这里有一个优化机会,可以同时执行这两个过程。您的函数将如下所示:
if(a <= b) {
if(b - a <= PI) {
return a <= g && g <= b;
} else {
return b <= g || g <= a;
}
} else {
if(a - b <= PI) {
return b <= g && g <= a;
} else {
return a <= g || g <= b;
}
}
或者,如果您需要它,您可以扩展到这种噩梦般的情况:
a <= b ?
(b - a <= PI && a <= g && g <= b) || (b - a > PI && (b <= g || g <= a)) :
(a - b <= PI && b <= g && g <= a) || (a - b > PI && (a <= g || g <= b))
请注意,所有这些数学都假定您的输入是弧度并且在 [0 : 2π] 范围内。
Live Example