1

私はターボC ++を使用してCの単純なグラフィカルライブラリで作業しています。これは、ペイントスタイルプログラムの非常に原始的なバージョンを開発しているためです。すべてがうまく機能しますが、フラッドフィルアルゴリズムを機能させることができません。4 方向のフラッド フィル アルゴリズムを使用しています。最初に再帰バージョンを試しましたが、小さな領域でしか機能せず、大きな領域を埋めるとクラッシュします。読むと、明示的なスタックバージョンを実装すると問題が解決することがわかりましたが、実際にはわかりません。

私はこのようなスタックを開発しました:

struct node
{
    int x, y;
    struct node *next;
};

int push(struct node **top, int x, int y)
{
    struct node *newNode;
    newNode = (struct node *)malloc(sizeof(struct node));
    if(newNode == NULL) //If there is no more memory
        return 0;
    newNode->x = x;
    newNode->y = y;
    newNode->next = *top;
    *top = newNode;
    return 1; //If we push the element correctly
}

int pop(struct node **top, int &x, int &y)
{
    if(*top == NULL) //If the stack is empty
        return 0;
    struct node *temporal;
    temporal = *top;
    x = (*top)->x;
    y = (*top)->y;
    *top = (*top)->next;
    free(temporal);
    return 1; //If we pop an element 
}

そして、これは私がフラッドフィル関数に作成したコードです:

void floodFill(int x, int y, int color_to_replace, int color_to_fill)
{
    if(color_to_replace == color_to_fill)
  return;
 struct node *stack = NULL;
 if(push(&stack, x, y) == 0) //If we can´t push the pixel
            return;
    while(pop(&stack, x, y) == 1) //While are pixels in the stack
    {
        pixel(x, y, color_to_fill);
        if(x+1 < 640 && read_pixel(x+1, y) == color_to_replace)
            if(push(&stack, x+1, y) == 0)
                return;
        if(x-1 >= 0 && read_pixel(x-1, y) == color_to_replace)
            if(push(&stack, x-1, y) == 0)
                return;
        if(y+1 < 480 && read_pixel(x, y+1) == color_to_replace)
            if(push(&stack, x, y+1) == 0)
                return;
        if(y-1 >= 0 && read_pixel(x, y-1) == color_to_replace)
            if(push(&stack, x, y-1) == 0)
                return;
    }
}

しかし、それでも機能しません。大きな領域を塗りつぶそうとすると停止します。プログラムで解像度 640 X 480 で作業しているため、これは本当に問題です。なぜそれがうまくいかないのですか?

4

2 に答える 2

5

スタック上のすべてのピクセルをプッシュする代わりに、スタック上の新しい位置をプッシュする前に、水平方向にできるだけ多くのピクセルを埋めるようにしてください。議論については、ウィキペディアの記事を参照してください。

于 2009-12-10T08:17:59.277 に答える
3

どこにも境界チェックが見られません...

X と Y の値が外れていませんか?

編集:

うまくいかなかった理由の追加のアイデア:

  • 読み取りおよび書き込みピクセル関数にはバグがあります
  • 返される色の値は 32 ビットに拡大され (たとえば、画像が 16 ビットであるため)、書き込んで再度読み込もうとしている色は正確には一致しません。(たとえば、色: 0xff00ff と書きますが、返される: 0xf800f8 は、色が 16 ビットから拡大されたためです)。これにより、塗りつぶしが永遠に続くことになります。
于 2009-12-10T08:19:41.310 に答える