Я пытаюсь создать функцию, которая рисует случайный треугольник на экране. Мне нужно убедиться, что треугольник хотя бы частично находится на экране (хотя он не обязательно должен быть полностью на экране).
Сначала я выбираю случайную точку с диапазоном случайных чисел, являющимся границами экрана, а затем я выбираю две случайные точки с диапазоном, который на 250 пикселей больше в каждом направлении.
Таким образом я удостоверяюсь, что хотя бы одна точка находится на экране, а это значит, что треугольник будет виден несмотря ни на что.
Вот мой код:
def add_triangle():
x1 = random.randint(0, wn_width)
y1 = random.randint(0, wn_height)
x2 = random.randint(-250, wn_width + 250)
y2 = random.randint(-250, wn_height + 250)
x3 = random.randint(-250, wn_width + 250)
y3 = random.randint(-250, wn_height + 250)
width = max(x1, x2, x3) - min(x1, x2, x3)
height = max(y1, y2, y3) - min(y1, y2, y3)
surface = pygame.Surface((width, height), pygame.SRCALPHA)
surface.fill((0, 0, 0, 0))
pygame.draw.polygon(surface, get_random_color(), [(x1, y1), (x2, y2), (x3, y3)])
shapes.append((surface, (min(x1, x2, x3), min(y1, y2, y3))))
# temporary code
add_triangle()
wn.blit(shapes[0][0], shapes[0][1])
Вот в чем проблема. По какой-то причине большую часть времени он даже не рисует треугольник, например, вот так:
или полигона вообще нет на экране (не уверен, что он вне кадра или просто не рисуется):
Что я делаю не так?
Кстати, если вы хотите убедиться, что все остальное написано правильно, вот остальная часть моего кода:
pygame.init()
clock = pygame.time.Clock()
wn_width = 1920
wn_height = 1080
wn = pygame.display.set_mode((wn_width, wn_height))
shapes = list()
def get_random_color():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
pygame.display.update()
clock.tick(20)
Они не учитывают смещение в верхнем левом углу ограничивающей рамки вашего случайного многоугольника. Вы не можете нарисовать многоугольник в координатах окна. Вы рисуете многоугольник на поверхности, которая точно соответствует размеру многоугольника. Многоугольник нужно рисовать в системе координат surface
. Между верхним левым screen
и верхним левым surface
находится перевод:
(0, 0) screen
+----------------------+
| |
| (0, 0) surface |
| +---+- -+ |
| | / \ | |
| | / \ | |
| +-------+ |
| |
+----------------------+
Итак, вам нужно переместить полигон в верхний левый угол поверхности. Вам нужно вычесть минимальные координаты из всех координат полигона:
def add_triangle():
x1 = random.randint(0, wn_width)
y1 = random.randint(0, wn_height)
x2 = random.randint(-250, wn_width + 250)
y2 = random.randint(-250, wn_height + 250)
x3 = random.randint(-250, wn_width + 250)
y3 = random.randint(-250, wn_height + 250)
min_x, min_y = min(x1, x2, x3), min(y1, y2, y3)
width = max(x1, x2, x3) - min_x
height = max(y1, y2, y3) - min_y
surface = pygame.Surface((width, height), pygame.SRCALPHA)
surface.fill((0, 0, 0, 0))
points = [(x1-min_x, y1-min_y), (x2-min_x, y2-min_y), (x3-min_x, y3-min_y)]
pygame.draw.polygon(surface, get_random_color(), points)
shapes.append((surface, (min_x, min_y)))
Смещение — это верхняя левая позиция ограничивающей рамки вашего случайного многоугольника.
Я даже не знал, что у функции draw.polygon есть смещение. Чем компенсируется?