Арифметика с углами
Ваша цель не состоит в том, чтобы разрезать, объединять или переворачивать списки.Ваша цель - сделать основную арифметику со степенями и сохранить результаты между 0
и 359
.Для этого вы действительно должны использовать оператор по модулю %
:
>>> 90 % 360
90
>>> 390 % 360
30
>>> -60 % 360
300
>>> 360 % 360
0
Вернуться к вопросу
Если вы хотите использовать эту нарезку только для градусов с постоянным приращением, вы можете создать нужный список напрямую:
>>> STEP = 15
>>> list(range(0, 360, STEP))
[0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345]
>>> def previous_degrees(start, n, step=STEP):
... return [(start - i * step) % 360 for i in range(n + 1)]
...
>>> previous_degrees(90, 12)
[90, 75, 60, 45, 30, 15, 0, 345, 330, 315, 300, 285, 270]
>>> previous_degrees(90, 12, 30)
[90, 60, 30, 0, 330, 300, 270, 240, 210, 180, 150, 120, 90]
>>> previous_degrees(90, 6, 45)
[90, 45, 0, 315, 270, 225, 180]
Ваш реальный вопрос
Вы написали в комментарии:
Этот массив градусов предназначен для работы с системой плавного вращения, которую я пытаюсь создать в Pygame.Обычно я просто нахожу разницу между текущим направлением и целевым направлением и приращением оттуда, но поскольку вращение переходит на ноль, мне нужно жестко закодировать значения, чтобы убедиться, что он всегда будет идти по кратчайшему возможному маршруту.
С двух сторон вам необходимо определить, следует ли вам поворачивать по часовой стрелке или против часовой стрелки.Вы можете снова использовать модуль по модулю, чтобы убедиться, что поворот будет между -180 ° и 179 °:
def shortest_rotation(start_angle, end_angle):
return (end_angle - start_angle + 180) % 360 - 180
Вот пример:
>>> shortest_rotation(0, 90)
90
>>> shortest_rotation(90, 0)
-90
>>> shortest_rotation(90, 90)
0
>>> shortest_rotation(90, 330)
-120
>>> shortest_rotation(0, 180)
-180
>>> shortest_rotation(0, 181)
-179
>>> shortest_rotation(0, 179)
179
>>> shortest_rotation(10, 350)
-20
Теперь вы можете создать списокуглы поворота в кратчайшем направлении:
def rotation_steps(start_angle, end_angle, n):
increment = shortest_rotation(start_angle, end_angle) / n
return [(start_angle + i * increment) % 360 for i in range(n + 1)]
Например:
>>> rotation_steps(90, 270, 12)
[90.0, 75.0, 60.0, 45.0, 30.0, 15.0, 0.0, 345.0, 330.0, 315.0, 300.0, 285.0, 270.0]
>>> rotation_steps(10, 350, 2)
[10.0, 0.0, 350.0]
Список использует float, чтобы не пропустить end_angle
, если increment
нетцелое число.