Функция рисования многоугольника в pygame не рисует правильное количество вершин

Я пытаюсь создать функцию, которая рисует случайный треугольник на экране. Мне нужно убедиться, что треугольник хотя бы частично находится на экране (хотя он не обязательно должен быть полностью на экране).

Сначала я выбираю случайную точку с диапазоном случайных чисел, являющимся границами экрана, а затем я выбираю две случайные точки с диапазоном, который на 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])

Вот в чем проблема. По какой-то причине большую часть времени он даже не рисует треугольник, например, вот так: not a triangle

или полигона вообще нет на экране (не уверен, что он вне кадра или просто не рисуется): empty

Что я делаю не так?

Кстати, если вы хотите убедиться, что все остальное написано правильно, вот остальная часть моего кода:

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)
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Они не учитывают смещение в верхнем левом углу ограничивающей рамки вашего случайного многоугольника. Вы не можете нарисовать многоугольник в координатах окна. Вы рисуете многоугольник на поверхности, которая точно соответствует размеру многоугольника. Многоугольник нужно рисовать в системе координат 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 есть смещение. Чем компенсируется?

Yuval Amir 16.05.2022 22:33

Смещение — это верхняя левая позиция ограничивающей рамки вашего случайного многоугольника.

Rabbid76 16.05.2022 22:35

Другие вопросы по теме