【问题标题】:Recursive Fractal Pygame - Not Displaying Shapes递归分形 Pygame - 不显示形状
【发布时间】: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 上这样做——因为它可能会对其他有类似问题的人有所帮助。

标签: python recursion pygame


【解决方案1】:

您必须调用pygame.display.flip(),通过调用pygame.event.pump()pygame.event.get() 处理事件,并在recursiveSquare 函数中使用pygame.time.Clock.tick 限制每秒帧数以限制CPU 使用率:

import pygame

def recursiveSquare(x, y, side, color, level):
        global done
        if level and not done:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    done = True

            rect = pygame.Rect(x - side/2, y - side/2, side, side)
            pygame.draw.rect(screen, color, rect)
            pygame.display.flip()
            clock.tick(FPS)

            for i in range(-1, 2):
                for j in range(-1, 2):
                    if i != 0 or j != 0:
                        recursiveSquare(x + side*i, y + side*j, side/3, color, level - 1)

pygame.init()
screen = pygame.display.set_mode((600, 600))
pygame.display.set_caption("Sierpinski Carpet")
clock = pygame.time.Clock()
FPS = 60
white = (255, 255, 255)
black = (0, 0, 0)
done = False

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    screen.fill(white)
    level = 4
    recursiveSquare(*screen.get_rect().center, screen.get_width()/3, black, level)
    pygame.display.flip()
    clock.tick(FPS)

pygame.quit()
quit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多