0

私の目的は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

コーディングスタイルがひどいもので、おそらく役に立たないことはわかっていますが、一般的な問題は、機能は(おそらく)機能しますが、骨の折れるほど遅く、私のかわいそうな小さなネットブックが対応できなくなるまで、以前に追加したピクセルを大量に追加するようです. 100,000ポイントで動作しています。

私はわずか 13 歳で、この厄介なコードにひどく混乱しているため、誰かがより良い機能を提案してくれれば、私のプログラムで本当に役に立ちます (if の 4 つの条件に注意してください)。

4

1 に答える 1

0

基本的に、求めているのは「塗りつぶし」アルゴリズムの最初の部分です。これは、Microsoft Paint などのプログラムが領域を新しい色で塗りつぶすために使用するものです。アルゴリズムは、最初に同じ色の接続されたすべてのピクセルを見つけてから、それらの色を変更します。Python の実装については、ウィキペディアのページまたはこのスタックオーバーフローの質問を確認してください。

コードに関しては、改善できる点がいくつかあります。私は提案します:

  1. set()リストの代わりに a を使用します。これにより、重複したポイントを処理する必要がなくなります
  2. s のみのif/elif代わりに句を使用します。ifこれにより、計算時間が短縮されます。
  3. あなたのif発言は非常に複雑ですが、非常に冗長です。それらをネストされたif/elifステートメントのグループに分割してみてください。

Flood-Fill アルゴリズムを調べて、持っているものを書き直してみてください。他の例を見ると、コードを大幅に合理化するのに役立つ場合があります。

于 2013-08-02T14:52:17.933 に答える