c ++泛洪填充图像递归算法错误

时间:2013-06-27 12:31:10

标签: c++ visual-c++ flood-fill

我正在编写一个填充方法来填充红色的图像(狗的轮廓)。

在我的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())

具有相同的结果。

蜂巢头脑中的任何人都可以提供原因和可能的解决方案吗?非常感谢你们。

1 个答案:

答案 0 :(得分:2)

有几个问题。先解决这些问题,看看会发生什么:

  1. 您在递归FloodFillrgb并非都等于0.但您不会更新任何这些值在你的while循环中。这会给你一个无限循环。

  2. 另一个问题是:

        mid.x++;
        FloodFill(mid);
        mid.x--;
        FloodFill(mid);
    

    设x为100.在mid.x++之后,x将为101.然后你再次x--离开x = 100。因此,您使用相同的x值递归调用FloodFill()。我认为这不是你想要的。

  3. FloodFill中,您再次调用x之前会增加FloodFill。但是你没有检查你是否到达了图像的右边界,因此FloodFill将以更大的x值递归调用,直到你得到一个stackoverflow,一个访问冲突或{由于整数溢出(无论先发生什么),{1}}被设置为0 agein。