Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中使用泛洪填充填充对象_Java_Flood Fill - Fatal编程技术网

在java中使用泛洪填充填充对象

在java中使用泛洪填充填充对象,java,flood-fill,Java,Flood Fill,这是我的问题。我创造了一个四叶三叶草,我想让他充满色彩。 我有一个简单的种子填充(洪水填充): package项目; 类种子填充{ 私有整数宽度; 私人内部高度; 私有int[]画布; 公共种子填充(整数宽度、整数高度、整数[]画布){ 这个。宽度=宽度; 高度=高度; this.canvas=画布; } 公共空白种子填充(整数x,整数y){ 内坐标=3*x+3*y*宽度; 如果(x=高度)返回; if(canvas[coord]==0&&canvas[coord+1]==255&&canvas

这是我的问题。我创造了一个四叶三叶草,我想让他充满色彩。 我有一个简单的种子填充(洪水填充):

package项目;
类种子填充{
私有整数宽度;
私人内部高度;
私有int[]画布;
公共种子填充(整数宽度、整数高度、整数[]画布){
这个。宽度=宽度;
高度=高度;
this.canvas=画布;
}
公共空白种子填充(整数x,整数y){
内坐标=3*x+3*y*宽度;
如果(x<0 | | y<0 | | x>=宽度| | y>=高度)返回;
if(canvas[coord]==0&&canvas[coord+1]==255&&canvas[coord+2]==0)返回;
if(canvas[coord]==255&&canvas[coord+1]==255&&canvas[coord+2]==255)返回;
//颜色
画布[coord]=255;
画布[coord+1]=255;
画布[coord+2]=255;
//递归的
种子填充(x,y-1);
种子填充(x,y+1);
种子填充(x-1,y);
种子填充(x+1,y);
}   
}
三叶草的总尺寸为400x400像素

当我运行项目时,它会显示以下错误消息:

线程“AWT-EventQueue-0”java.lang.StackOverflowerr中出现异常 在代码14、30和31行

显然,递归有一个问题,但我不太聪明,不知道如何更改代码来填充那个大对象

谢谢你的建议和帮助

seed\u fill()
为其4个邻居调用
seed\u fill()
,为其4个邻居调用
seed\u fill()
,为其4个邻居调用
seed\u fill()
,以此类推


所以你最终会接到一个没完没了的电话。例如,为(0,1)调用它会调用它(1,1),它会调用它(0,1),它会调用它(1,1),等等。

看起来每次调用
seed\u fill
都会为它的每个邻居调用
seed\u fill
。因此,如果你在
(a,b)
上调用它,并且在
(c,d)
上调用它,那么它将再次在
(a,b)
上调用它。你得到无限递归。您需要重新安排函数调用和检查以避免这种情况。
package projekt;

class SeedFill {        
private int width;
private int height;
private int[] canvas;

public SeedFill(int width, int height, int[] canvas){
    this.width = width;
    this.height = height;
    this.canvas = canvas;
}
public void seed_fill(int x, int y){
    int coord = 3*x + 3*y * width;

    if( x < 0 || y < 0 || x >= width || y >= height)return;

    if(canvas[coord] == 0 && canvas[coord+1] == 255 && canvas[coord+2] == 0)return;

    if(canvas[coord] == 255 && canvas[coord+1] == 255 && canvas[coord+2] == 255)return;

    //colors
    canvas[coord] = 255;
    canvas[coord+1] = 255;
    canvas[coord+2] = 255; 

    //recursive
    seed_fill(x,y-1);
    seed_fill(x,y+1);
    seed_fill(x-1,y);
    seed_fill(x+1,y);
}   
}