我的目标是创建一个名为findList()
的函数,它保存一个点和屏幕表面的给定参数。
我的目标是计算该点的颜色,然后返回填充颜色的列表。
例如,如果其中一个屏幕上有一个红色圆圈并且该点位于红色圆圈内,我希望能够返回一个包含该圆圈所有点的列表。
基本上,这个点会扩展,避开所有其他颜色和屏幕边缘,直到它不再扩展为止;然后函数返回所有创建的点的列表。
这是我试过的:
def findList(point,screen):
directions=[(0,0)]
myList=[]
myList.append(point)
startColour=screen.get_at(point)
i=0
loop=0
while True:
loop=loop+1
print(loop)
directions=[]
print("Length of myList: "+str(len(myList)))
for i in range(len(myList)):
if myList[i][0]+1<WINDOWWIDTH and screen.get_at((myList[i][0]+1,myList[i [1]))==startColour and myList[i][0]+1 not in myList and myList[i][0]+1 not in directions:
directions.append((myList[i][0]+1,myList[i][1]))
if myList[i][0]-1>0 and screen.get_at((myList[i][0]-1,myList[i][1]))==startColour and myList[i][0]-1 not in myList and myList[i][0]-1 not in directions:
directions.append((myList[i][0]-1,myList[i][1]))
if myList[i][1]+1<WINDOWHEIGHT and screen.get_at((myList[i][0],myList[i][1]+1))==startColour and myList[i][1]+1 not in myList and myList[i][1]+1 not in directions:
directions.append((myList[i][0],myList[i][1]+1))
if myList[i][1]-1>0 and screen.get_at((myList[i][0],myList[i][1]-1))==startColour and myList[i][1]-1 not in myList and myList[i][1]-1 not in directions:
directions.append((myList[i][0],myList[i][1]-1))
print(len(directions))
for i in directions:
myList.append(i)
if len(directions)==0:
break
print("Exited loop.")
return myList
我知道编码风格很糟糕,其中大部分内容可能都没用,但一般的问题是功能(可能)有效但速度很慢,而且似乎添加了之前添加的像素很多,直到我可怜的小上网本不能再使用应对它正在使用的10万点。
如果有人可以为更好的功能提出一些建议,这对我的程序真的很有帮助,因为只有13,我对这个混乱的代码感到非常困惑(请注意ifs中的4个条件)。
答案 0 :(得分:0)
基本上,您要求的是“Flood-Fill”算法的第一部分,即Microsoft Paint等程序用于填充具有新颜色的区域。该算法首先找到相同颜色的所有连接像素,然后改变它们的颜色。查看wikipedia page或此stackoverflow question以获取python实现。
至于你的代码,有几件事可以改进。我建议:
set()
代替列表。这样您就不必处理重复点if/elif
子句代替if
。这将减少计算时间。if
语句非常复杂但非常冗余。您可能希望尝试将它们分解为if/elif
语句的嵌套组。查看Flood-Fill算法并尝试重写您拥有的内容。查看其他一些示例可能会帮助您显着简化代码。