Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.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_Recursion_Stack Overflow - Fatal编程技术网

Java 如何制作照片编辑器的填充方法?

Java 如何制作照片编辑器的填充方法?,java,recursion,stack-overflow,Java,Recursion,Stack Overflow,我正在用java制作一个像素艺术编辑器,只是为了好玩,我遇到了一个问题。问题发生在我尝试创建fill函数时。这是密码 private void fill(int x, int y){ Color beforeColor = img[x][y]; img[x][y] = foregroundColor; if(x-1 >= 0){ if(img[x-1][y] == beforeColor){ fill(x-1, y);

我正在用java制作一个像素艺术编辑器,只是为了好玩,我遇到了一个问题。问题发生在我尝试创建fill函数时。这是密码

private void fill(int x, int y){
    Color beforeColor = img[x][y];
    img[x][y] = foregroundColor;

    if(x-1 >= 0){
        if(img[x-1][y] == beforeColor){
            fill(x-1, y);
        }
    }

    if(x+1 >= 0){
        if(img[x+1][y] == beforeColor){
            fill(x+1, y);
        }
    }

    if(y-1 >= 0){
        if(img[x][y-1] == beforeColor){
            fill(x, y-1);
        }
    }

    if(y+1 >= 0){
        if(img[x][y+1] == beforeColor){
            fill(x, y+1);
        }
    }
}
img是awt颜色对象的数组

这种方法基本上是在指定的像素周围检查相同颜色的像素,然后在下一个和下一个像素上再次运行该方法,直到整个区域被填满


如果您了解计算机中的堆栈和递归,那么您可能会意识到这将很快导致StackOverflower错误并停止程序。我想找出的是一种绕过递归的方法。有人能告诉我递归和StackOverflowerr的正确方向吗?提前感谢能够提供帮助的人。

可能是您可以使用一个列表:首先,您可以用您想要开始的像素填充它。然后你有一个循环,循环直到列表为空。在循环中,从列表中选取一个像素并检查其颜色。如果颜色与列表匹配,请将其与其相邻的对象添加到列表中。如果颜色不匹配,忽略像素。所以我会使用一个小助手类来存储像素的坐标。因此,它可能看起来是这样的(一些错误检查……可能会丢失,但这可能是一种方法):

类像素坐标{
公共int x;
公共智力;
公共像素坐标(整数x,整数y){
这个.x=x;这个.y=y;
}
}
颜色beforeColor=img[x][y];
列表工作列表=新建ArrayList();
//要开始的像素
添加(新像素坐标(x,y));
while(worklist.isEmpty()==false){
//从列表中选取一个像素
像素坐标像素=list.get(0);
列表。删除(0);
//检查它的颜色
if(img[x][y].等于(颜色之前){
//应用新颜色
img[x][y]=前底色;
//检查邻居
如果(x-1>=0){
添加(新的像素坐标(x-y,y));
}
//添加其他邻居。。。
}
}

这非常有帮助,因为我通常不使用列表,也从来没有想过这一点。我确实更改了一些内容,因为我需要的内容存在一些错误/误解,但效果很好。另外,为什么要对基本上是点对象的对象使用新类?啊,好吧,老实说,我在需要时从未找到过该类。此外,我还ten希望用坐标存储额外的数据,在这些情况下,一个小的helper类更容易实现——但是对于这个场景,Java Point类非常有用。
class PixelCoordinate {
    public int x;
    public int y;
    public PixelCoordinate(int x, int y) {
        this.x = x; this.y = y;
    }
}

Color beforeColor = img[x][y];
List<PixelCoordinate> worklist = new ArrayList<PixelCoordinate>();
// The pixel to start with
worklist.add(new PixelCoordinate(x, y));
while (worklist.isEmpty() == false) {
    // Take one pixel from the list
    PixelCoordinate pixel = list.get(0);
    list.remove(0);

    // Check its color
    if (img[x][y].equals(beforeColor) {
        // Apply new color
        img[x][y] = foregroundColor;
        // Check neighbors
        if (x-1 >= 0) {
            list.add(new PixelCoordinate(x-y, y));
        }
        // Add other neighbors...
    }
}