使用递归错误定位缩小图像

时间:2016-10-30 23:14:18

标签: c++ visual-c++

我正在编写采用图像并在原始图像中创建子图像的代码。我用一个矩形类递归地执行此操作,该矩形类跟踪子图像的开始和停止位置。在第三次递归调用之后,我遇到了麻烦。新的子图像被放置在不正确的位置。当它们接近图像的右上角时,它们应该在缩小。我已经通过调试器并观察了每次调用时开始和停止位置的变化,它们反映了向右上角的移动。我认为唯一的错误就是我创建了一个名为rRight的新矩形,用于递归调用。

Image

int main()
{
    CImage original("test256.gif");

    Rectangle rPrev(0, 0, original.getRows(), original.getCols());
    Rectangle r(0, 0, (original.getRows() / 2), (original.getCols() / 2));
    CImage final = fractal(original, r, rPrev);

    final.output("output.gif");
    system("PAUSE");
    return 0;
}

CImage fractal(CImage &origin, Rectangle &r, Rectangle &rPrev)
{
    if (r.getX2() - r.getX1() > 0 && r.getY2() - r.getY1() > 0)
    {
        drawTopLeft(origin, r, rPrev);

        Rectangle rRight(0, r.getY2(), (r.getX2() / 2), (r.getY2() + ((r.getY2() - r.getY1()) / 2)));
        fractal(origin, rRight, r);
    }
    return origin;
}

void drawTopLeft(CImage &origin, Rectangle &r, Rectangle &rPrev)
{
    for (int row = rPrev.getX1(); row < rPrev.getX2(); row += 2)
    {
        for (int col = rPrev.getY1(); col < rPrev.getY2(); col += 2)
        {
            pixel p1 = origin.getPixel(row, col);
            pixel p2 = origin.getPixel(row + 1, col);
            pixel p3 = origin.getPixel(row, col + 1);
            pixel p4 = origin.getPixel(row + 1, col + 1);

            int avgRed = (p1.red + p2.red + p3.red + p4.red) / 4;
            int avgGreen = (p1.green + p2.green + p3.green + p4.green) / 4;
            int avgBlue = (p1.blue + p2.blue + p3.blue + p4.blue) / 4;

            origin.setPixel((row / 2) + r.getX1(), (col / 2) + r.getY1(), avgRed, avgGreen, avgBlue);

        }
    }
}

0 个答案:

没有答案