0

我在Java中制作非递归洪水填充方法,它使用点击像素(x,y)的坐标和颜色代码作为输入。img 是缓冲图像。

代码有效,但仅适用于大而简单的形状(如正方形),有时甚至无法填充它们。如何纠正它始终以任何形状工作?

 public void floodFillNoRecursion (int x, int y, int color) {
  if (img.getRGB(x, y)!=Color.BLACK.getRGB()) {  
     return;
     } else {

      int x1=x;          
      int y1=y;

  img.setRGB(x, y, color); 

 for (int i=0;i<img.getHeight();i++)  {
     for (int j=0;j<img.getWidth();j++){

         if (img.getRGB(x1+1, y1)==Color.BLACK.getRGB()){
         x1++;
         img.setRGB(x1, y1, color);         
         }

         else if (img.getRGB(x1, y1+1)==Color.BLACK.getRGB()){
         y1++;
         img.setRGB(x1, y1, color);          
         }      

         else if (img.getRGB(x1, y1-1)==Color.BLACK.getRGB()){
         y1--;
         img.setRGB(x1, y1, color);     
         }

         else if (img.getRGB(x1-1, y1)==Color.BLACK.getRGB()){
         x1--;
         img.setRGB(x1, y1, color);         
         }
}} 
}}
4

2 回答 2

0

我认为问题在于变量 x1 和 y1 的递增和递减。例如,当img.getRGB(x1+1, y1)==Color.BLACK.getRGB()为真且img.getRGB(x1-1, y1)==Color.BLACK.getRGB()为真时,您首先增加 x1 变量和下一个 decrmenet,因此在 for 循环的下一次迭代中,您的 x1 与上一次迭代相同。

于 2017-02-02T11:17:44.620 回答
0

我建议使用不同的方法来避免您在递减/递增变量时所犯的错误:

(伪代码!)

void floodfill( Image img, int startX, int startY, int borderColor )
{
     Point startPoint = new Point(startX,startY);
     if( !isNoBorder(startPoint, img, borderColor ) return;
     List<Point> workList = new ArrayList<Point>();
     workList.Add( startPoint );

     while( workList.size() > 0 )
     {
         Point p = workList.remove(0);
         Point p1 = new Point( p.X+1, p.Y );
         Point p2 = new Point( p.X-1, p.Y );
         Point p3 = new Point( p.X, p.Y+1 );
         Point p4 = new Point( p.X, p.Y-1 );
         if( isNoBorder(p1, img, borderColor) && !workList.contains( p1 ) ) workList.Add( p1 );
         // same for p2-4
         img.setRGB( p.X, p.Y, borderColor );
     }
}

boolean isNoBorder( Point p, Image img, int borderColor ){
    return p.X >= 0 && p.Y >= 0 && p.X < img.getWidth() && p.Y < img.getHeight() && img.getRGB(p.X,p.Y) != borderColor  ;
}
于 2017-02-02T11:40:13.123 回答