フラッドフィルアルゴリズムを使用した方法があります。とてもシンプルです
上の最初の障害物に行きます。
ピクセルの色を下に変更
左右のピクセルが異なる色であるかどうかを確認しながら変更します
はいの場合: この列にも色を付けます (stack.push())
ループ。
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;
}
これらがなければ、コードは正常に機能し、同じ量の反復があるように見えます。これらの行が本当に役に立たないのか、それとも私が単に理解していないのかを理解するのを手伝ってくれませんか? (友達が無断で入れたなんて信じられない)