Python 如何在Pygame中填充由随机点组成的多边形?
目前对于一个项目,我有一个包含36(x,y)个坐标的列表变量。其目的是绘制一个填充内部的多边形。所有点都是随机的,但仅限于屏幕边框周围的一个大正方形,因此始终存在点边框。当我使用pygame.draw.polygon命令时。看起来,无论生成多少不同的随机点,出来的多边形总是被中心的许多洞和三角形形状弄得一团糟,而不是填充形状 使用draw.polygon命令是否有一些我不懂的规则 我使用的点数是否会对形状产生负面影响 为什么我在做一个封闭的形状,但它并没有完全填满 他们制作填充多边形的替代方法也是吗 谢谢你的帮助和时间 (图片在鼠标方向旋转) 这幅画是正面朝上的 我的主要问题是为什么多边形没有完全填充,为什么底部从来没有一直附着。Python 如何在Pygame中填充由随机点组成的多边形?,python,python-2.7,pygame,Python,Python 2.7,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==1
和i==2
案例分别用增加的x
和y
值来描述形状的上边缘和右边缘。您的i==3
和i==4
案例描述了底部和左侧,但它们也随着x
和y
值的增加而被描述。这将断开多边形角点之间的连接,并负责反转颜色和长对角线(在底边的端点和左边的起点之间)
下面是我建议的解决方案,它稍微概括了您的代码。我不是在一个无意义的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安装,因此我无法验证它是否能正确绘制多边形,但它至少会让您走上正确的轨道。我认为有两个问题 第一个问题是造成图像顶部的混乱。如果
i==1
,则此行有错误:
x = R.randrange(b*100,b*1000)
这会在循环中每次选择一个x
值,但选择范围是重叠的,而不是严格地增加范围。我怀疑您希望使用更像I==3
案例的逻辑:
x = R.randrange(b*1000,b*1000+1000)
第二个问题更像是一个逻辑问题。您是i==1
和i==2
案例分别用增加的x
和y
值来描述形状的上边缘和右边缘。您的i==3
和i==4
案例描述了底部和左侧,但它们也随着x
和y
值的增加而被描述。这将断开多边形角点之间的连接,并负责反转颜色和长对角线(在底边的端点和左边的起点之间)
下面是我建议的解决方案,它稍微概括了您的代码。我不是在一个无意义的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安装,因此我无法验证它是否能正确绘制多边形,但它至少会让您走上正确的轨道。我认为有两个问题 第一个问题是造成图像顶部的混乱。如果
i==1
,则此行有错误:
x = R.randrange(b*100,b*1000)
这会在循环中每次选择一个x
值,但选择范围是重叠的,而不是严格地增加范围。我怀疑您希望使用更像I==3
案例的逻辑:
x = R.randrange(b*1000,b*1000+1000)
第二个问题更像是一个逻辑问题。您是i==1
和i==2
案例分别用增加的x
和y
值来描述形状的上边缘和右边缘。您的i==3
和i==4
案例描述了底部和左侧,但它们也随着x
和y
值的增加而被描述。这将断开多边形角点之间的连接,并负责反转颜色和长对角线(在底边的端点和左边的起点之间)
下面是我建议的解决方案,它稍微概括了您的代码。我不是在一个无意义的i
数字上循环,也不是使用if
语句来处理不同的边,而是用一个4元组的值(起始x和y值,以及每个连续点的偏移量)来描述每条边,并在元组列表上循环。循环体非常简单,因为附加的随机偏移是