Как сделать так, чтобы объект, порожденный краем карты, следовал диагональной линии к середине? - PullRequest
1 голос
/ 14 января 2020

Я застрял при попытке заставить мой объект следовать диагональной линии к середине без большой задержки. Я только смог создать надежный путь для объекта, совершая только движения вправо, влево, вверх или вниз.

во время работы:

pygame.draw.rect(screen,(0,0,0),(0,0,width,height))
hero()
ewaste()
if distance(ex,ey,(width//2),(height//2)) != 0: 
    (dx,dy) = ((x - ex)/math.sqrt((x - ex) ** 2 + (y - ey) ** 2), (y - ey)/math.sqrt((x - ex) ** 2 + (y - ey) **2))
    ex, ey = int(ex + dx * 10), int(ey + dy * 10)

1 Ответ

0 голосов
/ 14 января 2020

Вы должны найти Единичный вектор от (ex, ey) до (width//2, height//2).
Единичный вектор можно найти, разделив вектор от (ex, ey) до (width//2, height//2) по его длине.
Длина вектора может быть вычислена по евклидову расстоянию .
Наконец умножьте вектор на шкалу (step), которая не превышает расстояние между точками, и добавьте его в позицию. например:

# vector from (`ex`,  `ey`) to (`width//2`, `height//2`)
dx, dy = width//2 - ex, height//2 - ey

# [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, 10)

    # step forward
    ex, ey = round(ex + ndx * step, round(ey + ndy * step)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...