我有一些洪水填充算法的方法。这很简单
前往顶部的第一个障碍。
将像素颜色更改为底部
在更改检查左/右像素是否为不同颜色时
如果是:也为该列着色(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;
}
没有这些,代码就可以正常工作,并且看起来它具有相同数量的迭代。你能帮我弄清楚这些线是真的没用还是我只是不理解它们?(我不敢相信我的朋友无目的放它们)