2017-11-11 21 views
0

私は再帰呼び出しを使用してシンプルなシードフィルアルゴリズムを実装しています。問題は、その再帰呼び出しでこの例外を投げることです:Javaで再帰呼び出しを使用してシードフィル - Stackoverflowエラー

スレッドの例外「AWT-EventQueueの-0」java.lang.StackOverflowErrorを

私は、わずかなスペースを埋めるためにしようとしていますStackのサイズは問題ではありません。誰かがなぜ例外がスローされているのか理解できますか?

seedfillクラス

package rasterops; 

import rasterdata.RasterImage; 

import java.awt.*; 
import java.awt.image.Raster; 
import java.util.List; 
import java.util.ArrayList; 
import java.util.Optional; 



public class SeedFill<PixelType> { 



    public RasterImage fill(final RasterImage<PixelType> img, final int x, final int y, PixelType borderColor, PixelType fillColor, PixelType bcgColor) { 


     RasterImage<PixelType> result = img; 

     PixelType color = (PixelType) img.getPixel(x,y); 

     if(bcgColor == color || color != borderColor){ 

      result = result.withPixel(x,y, fillColor); 

      fill(img, x+1, y, borderColor, fillColor,bcgColor); 
      fill(img, x-1, y, borderColor, fillColor,bcgColor); 
      fill(img, x, y+1, borderColor, fillColor,bcgColor); 
      fill(img, x, y-1, borderColor, fillColor,bcgColor); 

     } 


      return result; 

     } 


    } 

fill()メソッドの使用キャンバス

if(tool == 3){ 
         rasterImage = seedfill.fill(rasterImage, e.getX(), e.getY(), 0xffff00, 0x00ff00, 0x2f2f2f); 
         panel.repaint(); 

        } 

答えて

0

で私はあなたの再帰ベースケースに問題があると考えています。 if文

はここにあなただ:bcgColorは色と同じである場合にかかわらず、BORDERCOLORが何であるかのあなたが埋めるために開始されることを意味しbcgColor == color || color != borderColor

私はあなたが両方の条件ではなく、両方がまたはステートメントが偽であるために必要があるものである偽で​​あるより、再帰を開始する前に真実であることを知ってほしいので、これはbcgColor == color && color != borderColor

になりたいと思います。

関連する問題