我的任务是创建一个函数,为所有直接和间接邻居着色,颜色与给定像素(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);
}
}
答案 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];