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

时间:2015-01-21 05:55:29

标签: python python-2.7 pygame

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

使用我不理解的draw.polygon命令是否有某种规则?

我使用的点数会对形状产生负面影响吗?

为什么我正在制作一个封闭的形状,但它并没有完全填满?

他们的替代方法是否也可以制作填充多边形?

感谢您的帮助和时间。

(图片旋转看鼠标方向) picture of points enlarged(rotated look at mouse position)

enter image description here 这张照片正面朝上

我的主要问题是为什么多边形不是完全填充的,为什么底部永远不会完全附着 请参阅以下代码:

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)) 

绘制陈述

1 个答案:

答案 0 :(得分:2)

我相信有两个问题。

第一个问题是造成图像顶部的混乱。在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,所以我无法验证它是否会像多边形一样正确绘制,但它至少应该让你走上正确的轨道。