2017-02-02 10 views
0

私はクリックされたピクセル(x、y)の座標とカラーコードを入力として使用するJavaで非再帰的な洪水方法を作成しています。 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);   
     } 
}} 
}} 
+0

あなたは、少なくともそのコードをフォーマットしていただけますか? – Fildor

+0

あなたは1つのカラーコードを使用しています。それは、人工的に作られた写真でしか現実的ではありません。 jpegとbackへの変換でさえこれを破壊するでしょう。あなたはむしろ閾値を与えたいと思うでしょう。 – Fildor

+0

それから、デバッガでステップ実行する必要があります。インデックスバールにはいくつかの問題があります... – Fildor

答えて

0

変数x1とy1を増減する問題があると思います。たとえば、img.getRGB(x1+1, y1)==Color.BLACK.getRGB()が真でimg.getRGB(x1-1, y1)==Color.BLACK.getRGB()が真であるときは、最初にx1変数と次のdecrmenetをインクリメントするので、forループの次のインターラクションでは、x1は以前の繰り返しと同じです。

0

私はあなたがあなたのVARSをインクリメント/デクリメントで作っているエラーを回避するために異なるアプローチを使用することをお勧め:(!擬似コード)

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 ; 
} 
関連する問題