Как построить круги каждые 20 пикселей между двумя случайно сгенерированными точками в Pygame? - PullRequest
3 голосов
/ 21 мая 2019

Вопрос с домашним заданием, над которым я работаю, следующий:

"Нарисуйте два случайно расположенных круга радиусом 10 на экране, затем нарисуйте радиус 2 круга каждые двадцать пикселей от центра одного доцентр другого. "

У меня нет проблем случайным образом генерировать два круга радиусом 10, но я не знаю, как построить радиус радиусом 2 круга между ними.

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

Вот код, который у меня пока естьпроблема:

import pygame
from random import randint

linecolour = 0,0,0
bgcolour = 255, 255, 255
width = 600
height = 600

screen = pygame.display.set_mode((width, height))
running = 1

x = []
y = []

for i in range (2):
    x.append(randint(0,600))
    y.append(randint(0,600))


done = False
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: # or other types of events
            done = True

    screen.fill(bgcolour)

    for i,j in zip(x,y):
        pygame.draw.circle(screen,linecolour,(i,j),10)

        pygame.draw.circle(screen,linecolour,(i,j),2)

    pygame.display.flip()

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Это очень простая проблема, если вы посмотрите на нее правильно. Я бы рекомендовал смотреть на это с точки зрения полярных координат. Если у вас есть два круга с центром в (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)
2 голосов
/ 21 мая 2019

Рассчитать вектор направления от 1 точки к другой:

dir = x[1]-x[0], y[1]-y[0]

Рассчитать Евклидово расстояние между точками.Обратите внимание, что вы должны import math:

dist = math.sqrt(dir[0]*dir[0] + dir[1]*dir[1])

или, как указано в ответе @ MadPhysicist

dist = math.hypot(*dir)

количество точек, которые нужно нарисоватьint(dist) // 20Вычислите точки на линии в цикле:

for i in range(int(dist) // 20):
    px = int(x[0] + dir[0] * i*20/dist)
    py = int(y[0] + dir[1] * i*20/dist)

Код для рисования маленьких точек может выглядеть следующим образом:

done = False
while not done:

    # [...]

    dir = x[1]-x[0], y[1]-y[0]
    dist = math.hypot(*dir)
    for i in range(1, int(dist) // 20 + 1):
        pt = int(x[0] + dir[0] * i*20/dist), int(y[0] + dir[1] *i*20/dist)
        pygame.draw.circle(screen, linecolour, pt, 2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...