Это очень простая проблема, если вы посмотрите на нее правильно. Я бы рекомендовал смотреть на это с точки зрения полярных координат. Если у вас есть два круга с центром в (x[0], y[0])
и (x[1], y[1])
, наклон линии между ними равен (y[1] - y[0]) / (x[1] - x[0])
, но вы также можете посмотреть на угол линии:
phi = math.atan2(y[0] - y[1], x[0] - x[1])
Расстояние от одного центра до другого определяется как
r = math.hypot(y[0] - y[1], x[0] - x[1])
Теперь вы можете легко шагать вдоль линии от (x[0], y[0])
под углом phi
с шагом 20, пока ваше расстояние не превысит r
. X-координата i-го шага будет
i * 20 * math.cos(phi)
Аналогично, у-координата будет
i * 20 * math.sin(phi)
Вы можете рассчитать общее количество шагов как r // 20
. Кроме того, math.sin(math.atan2(y, x))
упрощается до y / math.hypot(y, x)
, а аналогичный косинус упрощается до x / math.hypot(y, x)
. В общем, вы получите
sep = 20
dx = x[1] - x[0]
dy = y[1] - y[0]
r = math.hypot(dy, dx)
n = int(r // sep)
x_step = sep * dx / r
y_step = sep * dy / r
coords = [(x[0] + i * x_step, y[0] + i * y_step) for i in range(n)]
Если вам нужны целочисленные координаты:
coords = [(x[0] + int(i * x_step), y[0] + int(i * y_step)) for i in range(n)]
На участок:
for coord in [(x[0] + int(i * x_step), y[0] + int(i * y_step)) for i in range(n)]:
pygame.draw.circle(screen, linecolour, coord, 2)