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)))
我正在尝试创建一个在屏幕上随机绘制三角形的函数。我需要确保三角形至少在一定程度上在屏幕上(尽管它不必完全在屏幕上)。
首先我选择一个随机点,随机数的范围是屏幕的边界,然后我选择两个随机点,每个方向的范围都大 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)))