边界填充模拟 (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]
。
我正在尝试用一个整数矩阵模拟边界填充方法,它在每个位置都有一个 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]
。