如何在pygames图形库中使用多边形制作菱形

时间:2019-01-09 18:10:25

标签: python graphics pygame

我不知道polygon函数如何排序点,文档也无济于事,所以我无法制作所需的菱形。

2 个答案:

答案 0 :(得分:1)

想象一下,您要在一张纸的坐标系中绘制这些点,然后立即用一条接一条的线将它们连接起来。因此,第一个点将连接到第二个点,第二个点将连接到第三个点,依此类推,最后一个点将连接到第一个点。最后,将得到的形状填充为所需的颜色。

import pygame as pg


pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
BG_COLOR = pg.Color('gray12')
BLUE = pg.Color('dodgerblue')
points = [(200, 200), (250, 250), (200, 300), (150, 250)]

done = False
while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True

    screen.fill(BG_COLOR)
    pg.draw.polygon(screen, BLUE, points)
    pg.display.flip()
    clock.tick(60)

答案 1 :(得分:1)

Pygame.draw.polygon是一项功能,可用于将多个点连接在一起并将它们绘制为形状。

这使您可以绘制形状灵活。如果您要记住的形状在pygame.drawpygame.gfxdraw的某处没有任何功能,则可以使用此功能自行创建。

以您要绘制的钻石为例。

首先,您可以绘制一个正方形并将其绕其中心旋转45°, 但由于您想使用polygon函数(可能更整洁)来绘制它,因此下面是一个示例

注意:用于此目的的点计算如下:

  • 首先定义宽度高度

    diamondWidth = 80
    diamondHeight = 100
    
  • 第1点和第3点 (菱形的顶部和底部):

    点1可以是屏幕上的任何点。如果愿意,您可以将其视为钻石的位置。

    我希望菱形位于中心,所以我将其定义如下:

    pos1 = (screenWidth/2, screenHeight/2 - diamondHeight/2)
    

    关于点3,它是菱形的底点。这意味着它具有相同的X,但是y值更大(具体来说,比点1的y值大diamondHeight)。那应该很容易

    pos3 = (pos1[0], pos1[1]+diamondHeight)
    
  • 第2点和第4点 (菱形的左右两点):

    点2和4之一必须在菱形的右边,另一个必须在菱形的左边。假设Point 2是左点。然后可以定义如下:

    pos2 = (pos1[0] - diamondWidth/2, pos1[1] + diamondHeight/2)
    

    点4只会在另一侧,这意味着它具有相同的Y值,但比点2的Y值小diamondWidth。在我的情况下,由于Point 2位于左侧,而Point 4位于右侧,所以Point {4}比Point 2高diamondWidth

    pos4 = (pos2[0]+diamondWidth, pos2[1])
    

现在我们定义了钻石的点,我们可以使用pygame.draw.polygon函数将它们连接起来并绘制形状。


旁注

您提到对函数感到困惑,因此这里是参数概述:

  1. 表面:要在其上绘制形状的屏幕,图像或任何其他pygame.Surface实例。在大多数情况下,这是您在代码顶部定义的屏幕。
  2. 颜色:用于绘制多边形的颜色。为简单起见,这是一个rgb值。如果您在第一个参数中传递的rgba实例收到一个pygame.Surface标志,则pygame.SRCALPHA值(增加透明度/半透明)可以生效,如下所示: pygame.Surface((width, height), pygame.SRCALPHA)
  3. pointlist:要连接的点的列表(也许是元组)。这些是按照它们连接的顺序进行的。即:列表中的第一点连接到第二点,第二点连接到第三点,第三点连接到第四点,依此类推。 最后一点也连接到第一个点以完成形状(否则将是一个开放形状,它的最后一侧未连接)

  4. width:最终(可选)参数。有时没有通过,因为 默认为0。

    • 如果值为0:形状将使用之前传递的color参数填充。

    • 如果形状> 0:仅绘制形状的轮廓,并且不填充该形状。线的粗细为该值 您通过。

我希望这可以解决。如果有任何疑问,请跟进


因此,这是使用多边形函数的示例。我只包含了主循环和一些设置,以缩短其长度。如果删除注释和一些设置代码(可能用您自己的代码替换),那么它将变成一个非常简短的程序:

import pygame
from pygame.locals import *

screenWidth = 600
screenHeight = 600

pygame.init()
window = pygame.display.set_mode((screenWidth, screenHeight))
pygame.display.set_caption("Diamond")

clock = pygame.time.Clock()
MAXFPS = 30

# define the diamond points as described above
diamondWidth = 80
diamondHeight = 100

pos1 = (screenWidth/2, screenHeight/2 - diamondHeight/2)
pos2 = (pos1[0] - diamondWidth/2, pos1[1] + diamondHeight/2)
pos3 = (pos1[0], pos1[1]+diamondHeight)
pos4 = (pos2[0]+diamondWidth, pos2[1])

# points for the first diamond
points = [pos1, pos2, pos3, pos4]

# points for the second diamond, which are exactly like the first except their
# Y value is incremented over the original points so it does not appear over
# it, but rather to it's left
secondPoints = [(p[0]+diamondWidth+10, p[1]) for p in points]

stop = False
while not stop:
    for event in pygame.event.get():
        if event.type == QUIT:
            stop = True

    window.fill((255, 255, 255))

    # DRAWING THE DIAMOND:
    # Here is where we connect all the points in the [points] array, and
    # draw them as a shape with a certain color (used cian because it's
    # a diamond-dy color lol)

    # Draw filled diamond
    pygame.draw.polygon(window, (0, 255, 255), points, 0)

    # Draw empty diamond with lines of thickness 4
    pygame.draw.polygon(window, (0, 255, 255), secondPoints , 4)

    pygame.display.flip()
    clock.tick(MAXFPS)

pygame.quit()