gpt4 book ai didi

c++ flood fill图像递归算法错误

转载 作者:行者123 更新时间:2023-11-30 04:17:02 25 4
gpt4 key购买 nike

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

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

同样的结果。

hive 思维中的任何人都可以提供原因和可能的解决方案吗?非常感谢大家。

最佳答案

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

  1. 您正在递归调用 FloodFill,而 rgb 并不都相等0. 但是您不会在 while 循环中更新这些值中的任何一个。那会给你一个无限循环。

  2. 这里还有一个问题:

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

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

  3. FloodFill 中,您在再次调用 FloodFill 之前递增 x。但是你不检查你是否已经到达图像的右边界,所以 FloodFill 将被递归调用,并且 x 的值越来越大,直到你得到一个 stackoverflow,访问冲突,或者 x 由于整数溢出(无论先发生什么)而设置为 0 agein。

关于c++ flood fill图像递归算法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17343250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com