我正在编写一个填充方法来填充红色的图像(狗的轮廓)。
在我的TestShellDlg.cpp中是泛洪填充方法。 CTestShellDlg :: m_pScreenDib成员是一个CDIB32位图类,它包含图形并绘制它们。
我想对当前像素进行采样,如果它不是黑色(轮廓的颜色),则将其染成红色。这是Dib32.cpp类中预构建的getter:
void CDIB32::GetRGB(int x, int y, BYTE& r, BYTE& g, BYTE& b)
{
if (x >= Width() || y >= Height())
IERROR;
int off = y * ByteWid() + x * 4;
b = m_pBits[off];
g = m_pBits[off+1];
r = m_pBits[off+2];
}
这是我在TestShellDlg.cpp类中的floodfill方法:
void CTestShellDlg::FloodFill(CPoint& mid)
{
byte r,g,b;
//while the current pixel colour is not black, set it to red and recursively loop
m_pScreenDib ->GetRGB(mid.x,mid.y, (byte) r,(byte) g,(byte)b);
while(r !=(byte)0, g !=(byte)0, b !=(byte)0)
{
m_pScreenDib -> SetRGB(mid.x, mid.y,(byte)255,(byte) 0,(byte) 0);
mid.x++;
FloodFill(mid);
mid.x--;
FloodFill(mid);
mid.y++;
FloodFill(mid);
mid.y--;
FloodFill(mid);
}
}
在构建和运行项目时,我在GetRGB()函数的IERROR中获得了一个断点。
在整个堆栈中,这发生在mid.x--几次运行之后。该程序似乎永远不会到达mid.y ++。
我也试过这个作为我的停止条件:
while(mid.x < m_pScreenDib ->Width() && mid.y < m_pScreenDib -> Height())
具有相同的结果。
蜂巢头脑中的任何人都可以提供原因和可能的解决方案吗?非常感谢你们。
答案 0 :(得分:2)
有几个问题。先解决这些问题,看看会发生什么:
您在递归FloodFill
时r
,g
和b
并非都等于0.但您不会更新任何这些值在你的while循环中。这会给你一个无限循环。
另一个问题是:
mid.x++;
FloodFill(mid);
mid.x--;
FloodFill(mid);
设x为100.在mid.x++
之后,x将为101.然后你再次x--
离开x = 100。因此,您使用相同的x值递归调用FloodFill()
。我认为这不是你想要的。
在FloodFill
中,您再次调用x
之前会增加FloodFill
。但是你没有检查你是否到达了图像的右边界,因此FloodFill
将以更大的x
值递归调用,直到你得到一个stackoverflow,一个访问冲突或{由于整数溢出(无论先发生什么),{1}}被设置为0 agein。