0

フラッドフィルアルゴリズムを使用した方法があります。とてもシンプルです

  1. 上の最初の障害物に行きます。

  2. ピクセルの色を下に変更

  3. 左右のピクセルが異なる色であるかどうかを確認しながら変更します

  4. はいの場合: この列にも色を付けます (stack.push())

  5. ループ。

        Stack<Point> st = new Stack<Point>();
        bool spLeft, spRight;
    
        Bitmap b = canvas.buffer;
    
        st.Push(start);
        spLeft = spRight = false;
    
    
        Point p = new Point();
        while (st.Count > 0) 
        {
            //going as far top as possible (finding first obstacle)
            p = st.Pop();
            while (p.Y >= 0 && b.GetPixel(p.X, p.Y) == oldColor) p.Y--;
            p.Y++;
            spLeft = spRight = false;
    
    
            //looping on every oldColored pixel in column
            while (p.Y < b.Height && b.GetPixel(p.X, p.Y) == oldColor) {
                b.SetPixel(p.X, p.Y, state.currentColor); //setting new color
    
                //checking if left pixel is oldColored and if it doesn't belong to span
                if (!spLeft && p.X > 0 && b.GetPixel(p.X - 1, p.Y) == oldColor) {
                    st.Push(new Point(p.X - 1, p.Y));
                    spLeft = true;
                }
                //checking if left pixel isn't oldColored and if it belongs to span
                else if (spLeft && p.X > 0 && b.GetPixel(p.X - 1, p.Y) != oldColor) {
                    spLeft = false;
                }
                if (!spRight && p.X < b.Width - 1 && b.GetPixel(p.X + 1, p.Y) == oldColor) {
                    st.Push(new Point(p.X + 1, p.Y));
                    spRight = true;
                }
                else if (spRight && p.X < b.Width - 1 && b.GetPixel(p.X + 1, p.Y) != oldColor) {
                    spRight = false;
                }
                p.Y++;
            }
    
        }
    

ポイントは、私はこれらの部分を理解していないということです

    //checking if left pixel isn't oldColored and if it belongs to span
    else if (spLeft && p.X > 0 && b.GetPixel(p.X - 1, p.Y) != oldColor) {
    spLeft = false;

    else if (spRight && p.X < b.Width - 1 && b.GetPixel(p.X + 1, p.Y) != oldColor) {
    spRight = false;
            }

これらがなければ、コードは正常に機能し、同じ量の反復があるように見えます。これらの行が本当に役に立たないのか、それとも私が単に理解していないのかを理解するのを手伝ってくれませんか? (友達が無断で入れたなんて信じられない)

4

1 に答える 1

3

複数の領域を埋めることができます。最初の if ステートメントは、それらが false であることを確認し、ピクセルをスタックに追加します。その領域が終了すると、それらはリセットされます。

spLeft 領域 2 をリセットしないと、最初の領域が検出されたときに true に設定されているため (これにより、不必要にスタックにロットが追加されるのを回避できます)、塗りつぶされません。

ここに画像の説明を入力

于 2012-08-16T15:56:52.387 に答える