如何填充由 Pygame 中的随机点组成的多边形?

How do I fill a polygon made up of randomized points in Pygame?

目前对于一个项目,我有一个包含 36 (x,y) 坐标的列表变量。目的是绘制一个内部填充的多边形。所有的点都是随机的,但仅限于屏幕边界周围的一个大正方形,因此总会有一个点的边界。当我使用 pygame.draw.polygon 命令时。似乎无论生成多少个不同的随机点,出来的多边​​形总是在中心有很多孔和形成的三角形形状,而不是填充形状。

使用 draw.polygon 命令有什么我不明白的规则吗?

我使用的点数对形状有负面影响吗?

为什么我做的是封闭的形状,但没有填满?

他们也有制作填充多边形的替代方法吗?

感谢您的帮助和时间。

(图片旋转看鼠标方向)

这张照片正面朝上

我的主要问题是为什么多边形没有完全填满,为什么底部从来没有完全附着。
请参阅下面的代码:

def build(self):  
    for i in range(1,5):  
        for b in range(1,7):  
            if i == 1:  
                x = R.randrange(b*100,b*1000)  
                y = R.randrange(0,1000)  
                points.append([x,y])  
            elif i == 2:  
                x = R.randrange(9000,10000)  
                y = R.randrange(b*1000-1000,b*1000)  
                points.append([x,y])  
            elif i == 3:  
                x = R.randrange(b*1000,b*1000+1000)  
                y = R.randrange(9000,10000)  
                points.append([x,y])  
            elif i == 4 and b!=9:  
                x = R.randrange(0,1000)  
                y = R.randrange(b*1000-1000,b*1000)  
                points.append([x,y])  

这是我的功能

    screen.fill(blue)

    pygame.draw.polygon(screen,green,(points)) 

绘制语句

我认为有两个问题。

第一个问题是图像顶部出现混乱。在 i == 1:

的情况下,此行有错误
x = R.randrange(b*100,b*1000)

每次循环都会选择一个 x 值,但选择的范围是重叠的,而不是严格递增的。我怀疑您想使用更像 i == 3 案例的逻辑:

x = R.randrange(b*1000,b*1000+1000)

第二个问题更多的是逻辑问题。您的 i == 1i == 2 案例描述了形状的上边缘和右边缘分别增加了 xy 值。您的 i == 3i == 4 案例描述了底部和左侧,但它们也被描述为增加了 xy 值。这打破了多边形角之间的连接,并导致颜色反转和长对角线(在底部边缘的末端和左侧边缘的开始之间)。

这是我建议的解决方案,它稍微概括了您的代码。我没有在无意义的 i 数字上循环并使用 if 语句来处理不同的边,而是通过值的 4 元组(起始 x 和 y 值,以及每个边的偏移量)来描述每个边连续点)并遍历元组列表。循环体非常简单,因为在计算每个坐标时都会添加一个额外的随机偏移量:

for x, dx, y, dy in [(0,1000, 0, 0), (9000, 0, 0, 1000),
                     (9000, -1000, 9000, 0), (0, 0, 9000, -1000)]:
    for b in range(9):
        points.append([x + b*dx + R.randrange(1000), y + b*dy + R.randrange(1000)])

我目前没有有效的 PyGame 安装,所以我无法验证这是否会像多边形一样完全正确地绘制,但它至少应该让你走上正确的轨道。