边界填充模拟 (C++)

Boundary Fill Simulation (C++)

我正在尝试用一个整数矩阵模拟边界填充方法,它在每个位置都有一个 0-255 的数字来标识 "pixel color" 我问一个位置,一个颜色是改变颜色来代替它。 我实现的代码适用于方阵,但如果它不是方阵,我有两个错误:

1- 如果行数大于列数,算法将忽略最后一行并在最后一行不做任何更改地执行所有操作。

2 - 如果列数大于行数,我会在第一次迭代时遇到分段错误。

我想从可以提供帮助的人那里了解我做错了什么。我尝试调试(打印,如果有人能告诉我更好的方法,wolb 将不胜感激)。逻辑似乎是正确的,这个分割错误很奇怪。

函数代码如下:

void BoundaryFill(int*** img, int x, int y, int newColor, int oldColor, int WIDTH, int HEIGTH){
 if(x >= 0 && x < WIDTH && y >= 0 && y < HEIGTH && (*img)[x][y] == oldColor && (*img)[x][y] != newColor){

     (*img)[x][y] = newColor; //set color before starting recursion
     BoundaryFill(img, x + 1, y, newColor, oldColor, WIDTH, HEIGHT);
     BoundaryFill(img, x - 1, y, newColor, oldColor, WIDTH, HEIGHT);
     BoundaryFill(img, x, y + 1, newColor, oldColor, WIDTH, HEIGHT);
     BoundaryFill(img, x, y - 1, newColor, oldColor, WIDTH, HEIGHT);
     BoundaryFill(img,x + 1, y + 1, newColor, oldColor,WIDTH,HEIGHT);
     BoundaryFill(img,x - 1, y - 1, newColor, oldColor,WIDTH,HEIGHT);
     BoundaryFill(img,x - 1, y + 1, newColor, oldColor,WIDTH,HEIGHT);
     BoundaryFill(img,x + 1, y - 1, newColor, oldColor,WIDTH,HEIGHT);
 } }

这里是主要代码:

int main(){
int x, y, new_color,old_color;

//Reads the size of the matrix
int HEIGHT; cin >> HEIGHT;
int WIDTH; cin >> WIDTH;

int** img = new int* [HEIGHT];
for (int i=0;i<HEIGHT;i++)
    img[i] = new int [WIDTH];

//Reads the matrix
for (int i=0;i<HEIGHT;i++){
    for (int j=0;j<WIDTH;j++){
        cin >> img[i][j];
    }
}

cin >> x >> y;
old_color = 1; //assuming the old color always gonna be 1
cin >> new_color;

BoundaryFill(&img,x,y,new_color,old_color ,WIDTH,HEIGHT);

//Shows the matrix
for (int i=0;i<HEIGHT;i++){
    for (int j=0;j<WIDTH;j++){
        cout << img[i][j] << " ";
    }
    cout << endl;
}

//Free the HEAP
for(int i = 0;i < WIDTH; i++)
    delete []img[i];
delete []img;}

这是我用来测试的一些输入文件和矩阵(无法将输入的数字放在矩阵格式上,但这些数字的意思是:前 2 个定义了矩阵,行数和列数。最后三个定义了开始位置和将要替换的颜色。剩下的是矩阵值的输入):

更多行:

8 7 2 1 1 1 1 1 2 1 2 1 1 1 2 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 2 1 1 1 2 1 1 1 2 1 2 1 1 1 1 1 2 2 2 1 1 1 2 2 2 1 5

更多专栏:

7 8 2 1 1 1 1 1 2 2 1 2 1 1 1 2 1 1 1 1 2 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 2 1 1 1 1 2 1 1 1 2 1 1 2 1 1 1 1 1 2 2 2 1 5

当您在 main 中设置数组时,img 的第一个下标是垂直 (HEIGHT),第二个是水平 (WIDTH)。在 BoundaryFill 中,首先使用水平索引,然后使用垂直索引。

您应该在 BoundaryFill 内使用 (*img)[y][x]