Python - координаты для поворота / перемещения инструкции
coordinates = [(0, 2), (0, 1), (1, 2), (1, 1), (0, 0), (1, 0), (1, 1), (0, 1), (0, 0)]
Я создал массив Python, указанный выше. Он содержит кортежи точек (x,y). Я предполагаю, что я начинаю с первого пункта (не оргина). Я хочу перейти к точкам в указанном порядке. Единственные функции движения, которые у меня есть, rotate90Degrees(direction)
где направление 1 или -1 для левого и правого соответственно. А также forward(time)
где время, как долго двигаться. Я буду считать, что время = 1 эквивалентно одной единице в системе координат. Есть ли умный способ легко изменить это в инструкции по перемещению без огромного if/else if/else? Что у меня так далеко:
start = coordinates[0]
for x in range(1,len(coordinates)):
finish = coordinates[x]
change.append((finish[0] - start[0],finish[1] - start[1]))
start = coordinates[x]
2 ответа
Итак, ваш робот направлен в известном кардинальном направлении и находится в каком-то известном месте, и вы хотите, чтобы он переместился в другое место.
Для начала вам нужен список кортежей, которые отображают направления смещения. Я буду использовать стандартную единицу окружности с углами, кратными 90 градусам:
atod = [(1, 0), (0, 1), (-1, 0), (0, -1)]
Так движется, если смотреть в направлении 0
означает, что ваша x-координата увеличивается на 1 за единицу времени, а ваша y-координата неизменна и так далее. Направления являются целыми числами от 0 до 3 включительно.
Теперь код должен выяснить, как поступить. Я бы начал с любого направления, в котором сейчас стоит робот. Скажите желаемое смещение(-2, 1)
а также dir
является 0
, atod[dir]
является (1, 0)
, Не обращайте внимания на тот, который равен нулю; делить -2
от 1
и вы получите -2
, так что это направление не годится, мы должны повернуть. Каким образом? Проверьте каждый, посмотрите, какой путь помогает. Если ни один из способов не помогает, вам нужно сделать 180, делайте это в любом направлении, которое вам нравится.
Итак, мы сделали ротацию, и теперь мы находимся в направлении 1
а также atod[dir]
является(0, 1)
, Итак, мы хотим двигаться вперед 1
, Сделай так. Теперь вам нужно снова вращаться, двигаться снова, и все готово.
Вы можете перемещаться вдоль оси север / юг или восток / запад, поскольку ваши повороты ограничены до 90 градусов.
Вы можете заметить, что любое движение будет иметь компонент север / юг и компонент восток / запад.
Если вы последовательны в своих движениях, то вы находитесь всего в одном повороте на 90 градусов от следующего шага:
1. turn east or west
2. move east or west
3. turn north or south
4. move north or south
5. You should be at your target
6. turn east or west
7. move east or west
8. turn north or south
9. move north or south
10. you should be at your (next) target
... так далее.
Если мы предположим, что ваш робот начинает выходить на север, то ваша петля должна сначала повернуть на восток / запад, затем двигаться, а затем повернуть на север / юг.
Вот начало. Это могут быть ваши глобальные данные и основной код.
Robot_pos = coordinates[0]
Robot_facing = NORTH
for next_pos in coordinates[1:]:
move_robot(next_pos)
Если мы предположим, что x - это восток / запад, а y - север / юг, то у вас есть что-то подобное для move_robot:
def move_robot(new_pos):
"""
Move robot from ``Robot_pos`` to ``new_pos`` given. The robot
is assumed to be facing either north or south upon entry, so
east/west movement is done first.
"""
delta_x = ...
turn_robot(EAST or WEST)
forward( some amount )
# similarly for Y
Вы должны быть немного умным в своем turn_robot()
код для оптимизации поворотов, начинаете ли вы в положительном или отрицательном направлении. Тем не менее, это всегда должен быть один поворот на 90 градусов.