Проверьте, находится ли число внутри кругового интервала - PullRequest
6 голосов
/ 07 июля 2011

Предположим, что у нас есть числовой круг, который варьируется от -180 до 180, и выглядит примерно так:

         180/-180
           ***
         *** ***
    90 ***     *** -90
         *** ***
           ***
            0

Часть круга всегда движется по часовой стрелке.Как определить, находится ли число внутри или за пределами развернутого интервала?

В следующем примере ввода / вывода первые два числа представляют интервал, а третье число - проверяемый номер.Вывод равен true, если точка (включительно) находится внутри интервала, в противном случае - false.

2 4 6
False
2 4 4
True
90 -90 0
False
90 -90 -180
True

Ответы [ 3 ]

14 голосов
/ 07 июля 2011
  • Нормализуйте свои числа от 0 до 359. Рассмотрите аргументы a, b и c (это c внутри разметки a -> b). Как указал Крис Каннингем, вы также можете нормализовать до -180 до +179;см. обсуждение ниже.Важная часть нормализации - убедиться, что только одна цифра относится к каждой точке на окружности.

  • Если (a <= b), вернуть (c >= a && c <= b)

  • иначе вы прошли через 0 и должны вернуть (c >= b || c <= a) (c >= a || c <= b)

1 голос
/ 07 июля 2011

Все точки x, которые находятся в [a, b], проверяют:

, если a% 360 <= b% 360: </p>

(x)%360<=b%360 and x%360>=a%360, если вы обрабатываете в прямом смысле.

в противном случае ваш интервал содержит 0, и вы можете просто проверить.х в [а, б]

поэтому:

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

Я мог бы обратить некоторые вещи ... так что вы можете бытьнужно проверить это снова.

0 голосов
/ 07 июля 2011

У вас есть start и end в качестве конечных точек интервала.

range = 360
if start > end:
    if number > start:
        end += range
    else:
        start -= range
inside = (number >= start) and (number <= end)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...