仅在第一次调用递归函数时初始化值

时间:2013-11-16 21:53:45

标签: c image function recursion constants

我的任务是创建一个函数,为所有直接和间接邻居着色,颜色与给定像素(x,y)相同。基本上它应该像Paint中的填充工具一样工作。 那是我的代码到目前为止:

void fill(struct Image *image, int x, int y, uint8_t newGrayValue) {
    int grayValue = image->data[y * image->width + x];

    if (image->data[y * image->width + x] == grayValue) {
        image->data[y * image->width + x] = newGrayValue;


        fill(image, x + -1, y + -1, newGrayValue);
        fill(image, x +  0, y + -1, newGrayValue);
        fill(image, x +  1, y + -1, newGrayValue);
        fill(image, x + -1, y +  0, newGrayValue);
        fill(image, x +  1, y +  0, newGrayValue);
        fill(image, x + -1, y +  1, newGrayValue);
        fill(image, x +  0, y +  1, newGrayValue);
        fill(image, x +  1, y +  1, newGrayValue);
    }
}

问题是每次调用函数时,它都会重置变量greyValue。是否有可能在第一次函数调用上基于输入像素(x,y)定义greyValue

编辑:问题解决了,这是我的最终代码:

void fillRecursive(struct Image *image, int x, int y, uint8_t grayValue, uint8_t newGrayValue) {
    if (image->data[y * image->width + x] == grayValue) {
        image->data[y * image->width + x] = newGrayValue;


        fillRecursive(image, x + -1, y + -1, grayValue, newGrayValue);
        fillRecursive(image, x +  0, y + -1, grayValue, newGrayValue);
        fillRecursive(image, x +  1, y + -1, grayValue, newGrayValue);
        fillRecursive(image, x + -1, y +  0, grayValue, newGrayValue);
        fillRecursive(image, x +  1, y +  0, grayValue, newGrayValue);
        fillRecursive(image, x + -1, y +  1, grayValue, newGrayValue);
        fillRecursive(image, x +  0, y +  1, grayValue, newGrayValue);
        fillRecursive(image, x +  1, y +  1, grayValue, newGrayValue);
    }
}

void fill(struct Image *image, int x, int y, uint8_t newGrayValue) {
    int grayValue = image->data[y * image->width + x];
    printf("%d\n", grayValue);
    if (grayValue != newGrayValue) {
        fillRecursive(image, x, y, grayValue, newGrayValue);
    }
}

2 个答案:

答案 0 :(得分:4)

使grayValue成为递归函数的参数,以便你 可以传递给下一个电话:

void recursive_fill(struct Image *image, int x, int y, uint8_t grayValue, uint8_t newGrayValue)
{
    if (image->data[y * image->width + x] == grayValue) {
        image->data[y * image->width + x] = newGrayValue;
        recursive_fill(image, x + -1, y + -1, grayValue, newGrayValue);
        // ...
    }
}

并使用

开始递归
void fill(struct Image *image, int x, int y, uint8_t newGrayValue)
{
    recursive_fill(image, x, y, image->data[y * image->width + x], newGrayValue);
}

答案 1 :(得分:2)

让它静止:

static int grayValue = 0;
if(grayValue == 0)
grayValue=image->data[y * image->width + x];