pygame 中的绘制多边形函数未绘制正确数量的顶点

The draw polygon function in pygame doesn't draw the correct amount of vertices

我正在尝试创建一个在屏幕上随机绘制三角形的函数。我需要确保三角形至少在一定程度上在屏幕上(尽管它不必完全在屏幕上)。

首先我选择一个随机点,随机数的范围是屏幕的边界,然后我选择两个随机点,每个方向的范围都大 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)

它们没有考虑到随机多边形边界框左上角位置的偏移量。您不能在 window 坐标中绘制多边形。您在与多边形大小完全相同的表面上绘制多边形。需要在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)))