如何填充由 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 == 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 安装,所以我无法验证这是否会像多边形一样完全正确地绘制,但它至少应该让你走上正确的轨道。
目前对于一个项目,我有一个包含 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 安装,所以我无法验证这是否会像多边形一样完全正确地绘制,但它至少应该让你走上正确的轨道。