Чтобы алгоритм работал, вы должны работать с числами с плавающей запятой. Если m
и p
являются pygame.Rect
объектами, то алгоритм не будет работать, pygame.Rect
работает с целыми числами и часть дроби теряется.
Примечание math.sin(angle_radians)
и math.cos(angle_radians)
is <= 1. </p>
Это означает, что вы должны хранить позиции объектов в отдельных переменных. Предположим, у вас есть координаты с плавающей запятой (mx
, my
) и (py
, py
)
. Вы должны найти Единичный вектор из (mx
, my
) до (px
, py
).
Единичный вектор можно найти, разделив вектор с (mx
, m.y
) на (px
, py
) по его длине.
Длина вектора может быть вычислена как Евклидово расстояние .
Наконец, умножьте вектор на шкалу (step
), которая не больше расстояния между указывает и добавить его в позицию. Например:
stepDist = 1
# vector from (`mx`, `my`) to (`px`, `py`)
dx, dy = p.y - mx, py - px
# [Euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance)
len = math.sqrt(dx*dx + dy*dy)
if len > 0:
# [Unit vector](https://en.wikipedia.org/wiki/Unit_vector)
ndx, ndy = dx/len, dy/len
# minimum of step size and distance to target
step = min(len, stepDist)
# step forward
px += ndx * step
py += ndy * step
Если нужен объект pygame.Rect
, тогда можно задать положение прямоугольника. Например:
m.topleft = round(mx), round(my)
p.topleft = round(px), round(py)
Но не обязательно сохранять позиции в (mx
, my
) соответственно (px
, py
). Если вы сделаете mx, my = m.topleft
соответственно px, py = p.topleft
, то алгоритм сломается, потому что компонент дроби теряется.