Функция рисования многоугольника в 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])

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

или полигона вообще нет на экране (не уверен, что он вне кадра или просто не рисуется): Функция рисования многоугольника в pygame не рисует правильное количество вершин

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

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

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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
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

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