时间:2011-07-07 16:13:50

标签: math language-agnostic numbers

让我们假设我们有一个数字圆,范围从-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

3 个答案:

答案 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)

您有startend作为intervall的端点。

range = 360
if start > end:
    if number > start:
        end += range
    else:
        start -= range
inside = (number >= start) and (number <= end)