Стандартный способ сделать это состоит в использовании модуль. This answer от sschuberth показывает, как это сделать в C/C++.
Вот реализация и тест на Python. Код проще в Python, потому что в Python a % b
всегда имеет тот же знак, что и b
.
тест код перебирает все пары углов от 0 до 360 градусов с шагом 60, для a
и b
, проверяя все углы x
от 0 до 360 градусов с шагом 30. Сектор начинается a
и несется через до b
. Таким образом, сектор (60, 120) содержит 60 °, но (120, 60) содержит 300 °.
Если x
находится в этом секторе (включая конечные точки), он добавляется в список result
.
def in_angle_interval(x, a, b):
return (x - a) % 360 <= (b - a) % 360
# test
for a in range(0, 420, 60):
for b in range(0, 420, 60):
result = [x for x in range(0, 390, 30) if in_angle_interval(x, a, b)]
print('{:3}-{:3} {}'.format(a, b, result))
выход
0- 0 [0, 360]
0- 60 [0, 30, 60, 360]
0-120 [0, 30, 60, 90, 120, 360]
0-180 [0, 30, 60, 90, 120, 150, 180, 360]
0-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 360]
0-300 [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 360]
0-360 [0, 360]
60- 0 [0, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360]
60- 60 [60]
60-120 [60, 90, 120]
60-180 [60, 90, 120, 150, 180]
60-240 [60, 90, 120, 150, 180, 210, 240]
60-300 [60, 90, 120, 150, 180, 210, 240, 270, 300]
60-360 [0, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330, 360]
120- 0 [0, 120, 150, 180, 210, 240, 270, 300, 330, 360]
120- 60 [0, 30, 60, 120, 150, 180, 210, 240, 270, 300, 330, 360]
120-120 [120]
120-180 [120, 150, 180]
120-240 [120, 150, 180, 210, 240]
120-300 [120, 150, 180, 210, 240, 270, 300]
120-360 [0, 120, 150, 180, 210, 240, 270, 300, 330, 360]
180- 0 [0, 180, 210, 240, 270, 300, 330, 360]
180- 60 [0, 30, 60, 180, 210, 240, 270, 300, 330, 360]
180-120 [0, 30, 60, 90, 120, 180, 210, 240, 270, 300, 330, 360]
180-180 [180]
180-240 [180, 210, 240]
180-300 [180, 210, 240, 270, 300]
180-360 [0, 180, 210, 240, 270, 300, 330, 360]
240- 0 [0, 240, 270, 300, 330, 360]
240- 60 [0, 30, 60, 240, 270, 300, 330, 360]
240-120 [0, 30, 60, 90, 120, 240, 270, 300, 330, 360]
240-180 [0, 30, 60, 90, 120, 150, 180, 240, 270, 300, 330, 360]
240-240 [240]
240-300 [240, 270, 300]
240-360 [0, 240, 270, 300, 330, 360]
300- 0 [0, 300, 330, 360]
300- 60 [0, 30, 60, 300, 330, 360]
300-120 [0, 30, 60, 90, 120, 300, 330, 360]
300-180 [0, 30, 60, 90, 120, 150, 180, 300, 330, 360]
300-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 300, 330, 360]
300-300 [300]
300-360 [0, 300, 330, 360]
360- 0 [0, 360]
360- 60 [0, 30, 60, 360]
360-120 [0, 30, 60, 90, 120, 360]
360-180 [0, 30, 60, 90, 120, 150, 180, 360]
360-240 [0, 30, 60, 90, 120, 150, 180, 210, 240, 360]
360-300 [0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 360]
360-360 [0, 360]
А вот тест с использованием данных в вопросе.
coef = [[1,22], [2,24], [359,15], [360,21]]
print(coef)
for x in range(0, 361):
sel = [coe for coe in coef if in_angle_interval(x, coe[0], coe[1])]
if sel:
print('{:3} {}'.format(x, sel))
выход
[[1, 22], [2, 24], [359, 15], [360, 21]]
0 [[359, 15], [360, 21]]
1 [[1, 22], [359, 15], [360, 21]]
2 [[1, 22], [2, 24], [359, 15], [360, 21]]
3 [[1, 22], [2, 24], [359, 15], [360, 21]]
4 [[1, 22], [2, 24], [359, 15], [360, 21]]
5 [[1, 22], [2, 24], [359, 15], [360, 21]]
6 [[1, 22], [2, 24], [359, 15], [360, 21]]
7 [[1, 22], [2, 24], [359, 15], [360, 21]]
8 [[1, 22], [2, 24], [359, 15], [360, 21]]
9 [[1, 22], [2, 24], [359, 15], [360, 21]]
10 [[1, 22], [2, 24], [359, 15], [360, 21]]
11 [[1, 22], [2, 24], [359, 15], [360, 21]]
12 [[1, 22], [2, 24], [359, 15], [360, 21]]
13 [[1, 22], [2, 24], [359, 15], [360, 21]]
14 [[1, 22], [2, 24], [359, 15], [360, 21]]
15 [[1, 22], [2, 24], [359, 15], [360, 21]]
16 [[1, 22], [2, 24], [360, 21]]
17 [[1, 22], [2, 24], [360, 21]]
18 [[1, 22], [2, 24], [360, 21]]
19 [[1, 22], [2, 24], [360, 21]]
20 [[1, 22], [2, 24], [360, 21]]
21 [[1, 22], [2, 24], [360, 21]]
22 [[1, 22], [2, 24]]
23 [[2, 24]]
24 [[2, 24]]
359 [[359, 15]]
360 [[359, 15], [360, 21]]
не все элементы в конечном итоге будут включены в Сель, если вы пробегаем по всем возможным углам? – user3684792