【发布时间】:2015-05-09 13:45:38
【问题描述】:
我正在尝试在 Pygame 中使用递归对谢尔宾斯基地毯进行编码。代码运行良好,问题是屏幕只显示一个递归调用,而不是代码所示的 8 个。不过,我很确定它正在经历那些递归调用,因为我设置了时间延迟,并且实际完成绘图需要时间。 我的问题是:每次递归调用时显示形状的代码中缺少什么?谢谢,代码如下:
import pygame
white = (255, 255, 255)
black = (0, 0, 0)
def recursiveSquare(x, y, side, color, level):
if level:
(x2, y2) = (x + side, y)
(x3, y3) = (x, y + side)
(x4, y4) = (x + side, y + side)
pygame.draw.polygon(screen, color, [(x, y), (x2, y2), \
(x4, y4), (x3, y3)])
recursiveSquare((side * 0.3), (side * 0.3), \
(side * 0.3), color, level - 1)
recursiveSquare((side * 0.3) * 4.5, (side * 0.3), \
(side * 0.3), color, level - 1)
recursiveSquare((side * 0.3) * 8, (side * 0.3), \
(side * 0.3), color, level - 1)
recursiveSquare((side * 0.3), (side * 0.3) * 4.5, \
(side * 0.3), color, level - 1)
recursiveSquare((side * 0.3) * 8, (side * 0.3) * 4.5,\
(side * 0.3), color, level - 1)
recursiveSquare((side * 0.3), (side * 0.3) * 8, \
(side * 0.3), color, level - 1)
recursiveSquare((side * 0.3) * 4.5, (side * 0.3) * 8,\
(side * 0.3), color, level - 1)
recursiveSquare((side * 0.3) * 8, (side * 0.3) * 8,\
(side * 0.3), color, level - 1)
pygame.init()
size = [600, 600]
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Sierpinski Carpet")
done = False
clock = pygame.time.Clock()
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
screen.fill(white)
level = 3
recursiveSquare(200, 200, 200, black, level)
pygame.display.flip()
clock.tick(20)
pygame.quit()
quit()
【问题讨论】:
-
您的代码正在绘制并显示递归调用的结果——全部 73 个用于起始
level = 3。问题在于,由于您计算它们的位置和大小的方式,许多较低级别的完全相同,因此只有唯一的可以区分。 -
如何更改代码,或者在这种情况下,我计算新位置的方式以便屏幕显示所有结果?
-
您的递归函数计算每个较低级别的 x、y 位置,只需按比例缩小传递的级别,将其中许多级别相对于左上角的原点 (0, 0) 放置在同一位置.我认为除了缩小尺寸之外,您还需要翻译——添加一些 delta-x 和 delta-y 值——将每个值添加到当前级别的位置,以使它们都相对于它所在的位置。顺便说一句,如果您将所有冗余计算替换为存储在局部变量中的单个值,您的代码会更简单、更快、更容易理解。
-
我刚刚更改了我的代码并遵循了您的建议,它终于奏效了!非常感谢!
-
很高兴听到这个消息。你应该回答你自己的问题并在这里发布工作代码——你可以在 stackoverflow 上这样做——因为它可能会对其他有类似问题的人有所帮助。