洪水填充算法在python中崩溃

时间:2014-01-26 15:14:39

标签: python algorithm numpy

我正在尝试使用泛洪填充递归算法填充多边形中的颜色。我在python 2.7编码。我走向填充中途然后崩溃。它一直在我运行代码时发生。代码有什么问题,或者只是我的笔记本电脑中的问题。请帮忙?谢谢。这是代码。

    import pygame
    import numpy as np
    from pygame.locals import *
    import sys
    def flood_fill(name, x, y, color):
        get = name.get_at((x, y))
        if get == (0, 0, 0, 255):
            screen.set_at((x, y), red)
            pygame.display.flip()
            flood_fill(name, x + 1, y, color)
            flood_fill(name, x - 1, y, color)
            flood_fill(name, x, y + 1, color)
            flood_fill(name, x, y - 1, color)

   if __name__ == '__main__':
        pygame.init()
        sys.setrecursionlimit(1500000000)
        width = 640
        height = 480
        resolution = (width, height)
        screen = pygame.display.set_mode(resolution)
        black = (0, 0, 0)
        white = (255, 255, 255)
        red = (255, 0, 0)
        pygame.draw.rect(screen, white, [20, 20, 250, 100], 2)
        flood_fill(screen, 100, 50, red)
        while True:
            for event in pygame.event.get():
                if event.type == QUIT:
                    pygame.quit()
                    sys.exit()
            pygame.display.flip()

2 个答案:

答案 0 :(得分:1)

非常确定您的递归限制是个问题。所有setrecursionlimit确实删除了会阻止你做蠢事的警告;它不会神奇地在CPU中创建晶体管来保存1500000000调用堆栈。

在堆栈上实施洪水填充通常是个坏主意。改为在while循环中使用堆栈数据结构。

答案 1 :(得分:0)

你应该提供你正在获得的错误,但根据代码,我认为错误是IndexError,你应该检查像素坐标是否是有效坐标,即它们总是位于在你的情况下表面是screen

根据documentationIf the pixel position is outside the area of the Surface an IndexError exception will be raised.

请确保get_at方法获取有效参数或用try\except块包围它。