我有一些洪水填充算法。这很简单
转到第一个障碍物。
将像素颜色更改为底部
在更改时检查左/右像素是否为不同颜色
如果是:也为此列着色(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;
}
没有这些,代码工作正常,似乎它具有相同的iterrations量。你能帮我弄清楚这些线是否真的没用或我只是不理解它们? (我不能相信我的朋友没有目的地把它们放在一起)
答案 0 :(得分:3)
它们允许填充多个区域。打开if语句检查它们是否为false并向堆栈添加一个像素。那些区域完成后重置。
没有重置spLeft区域2将不会被填充,因为当遇到第一个区域时,它将被设置为true(这避免了无意中添加批次)。