让我们假设我们有一个数字圆,范围从-180到180,看起来像这样:
180/-180
***
*** ***
90 *** *** -90
*** ***
***
0
圆圈的一部分始终以顺时针方向扫过。如何判断一个数字是在扫描间隔的内部还是外部?
在以下示例I / O中,前两个数字表示间隔,第三个数字是要检查的数字。如果点(包含)在区间内,则输出为true,否则为false。
2 4 6
False
2 4 4
True
90 -90 0
False
90 -90 -180
True
答案 0 :(得分:13)
将数字从0归一化到359.考虑参数a,b和c(在a - > b的扫描范围内是c)。 正如克里斯坎宁安所指出的,你也可以归一化到-180到+179;见下面的讨论。标准化的重要部分是确保只有一个数字指的是圆上的每个点。
如果(a <= b)
,则返回(c >= a && c <= b)
否则你已横扫0点并应返回 (c >= b || c <= a)
(c >= a || c <= b)
答案 1 :(得分:1)
[a,b]中的所有点x验证:
如果%360&lt; = b%360:
(x)%360<=b%360 and x%360>=a%360
如果您使用直接传感进行处理。
否则你的intervall包含0,你可以验证。 x在[a,b]
中因此:
def f(x,a,b):
if a%360<=b%360:
return ((x)%360<=b%360 and x%360>=a%360)
else:
return b>=x>=a
做你需要的。
>>> f(0,90,-90)
False
>>> f(-180,90,-90)
True
>>> f(4,2,4)
True
>>> f(6,2,4)
False
我可能会反过来......所以你可能需要再次检查它。
答案 2 :(得分:0)
您有start
和end
作为intervall的端点。
range = 360
if start > end:
if number > start:
end += range
else:
start -= range
inside = (number >= start) and (number <= end)