# Recursive Fill



## shino (10. Nov 2009)

hallo zusammen  

ich hab da mal wieder ein problem und zwar folgendes:
ich muss ein programm schreiben, bei welchem ich auf eine der flächen auf diesem bild






anklicken muss, dann ne farbe für die änderung angeben und dann sollte das programm die fläche nach der gewünsten farbe einfärben.


```
import java.awt.Color;
import ch.unibas.informatik.cs101.ImageWindow;
import ch.unibas.informatik.cs101.ImageWindowMouseListener;
import ch.unibas.informatik.cs101.KeyListener;

public class RecursiveFill {				
	
	private static ImageWindow w=null;

	static void Fueller(int x, int y, Color fuell, Color rand){
				Color current=w.getPixel(x, y);
				
				if ( (current.equals(rand)) && !(current.equals(fuell)) ){
					w.setPixel(x, y, fuell.getRed(), fuell.getGreen(), fuell.getBlue());
					
					Fueller(x+1, y, fuell, rand);
					Fueller(x-1, y, fuell, rand);
					Fueller(x, y+1, fuell, rand);
					Fueller(x, y-1, fuell, rand);
				}
				w.redraw();
	}
	
	public static void main(String[] args) {
		w=new ImageWindow(500,500);
		w.openWindow("forms", 500, 0);		
		w.loadImage("forms.png");	
		w.redraw();
		
		while (w.isWindowOpen()) {
			if (w.mousePressed()) {
				int mouseX=w.getMouseXPos();
				int mouseY=w.getMouseYPos();
				
				int r,g,b;
				r=0; b=0; g=0;
				
				if(op.equals("rot"))r=255;
				if(op.equals("gruen"))g=255;
				if(op.equals("blau"))b=255;
				Color fuell=new Color(r, g, b);
				Color rand=w.getPixel(mouseX, mouseY);
				Fueller(mouseX, mouseY, fuell, rand);
				w.redraw();
			}
			
			w.pause(10);
		}

	}
	

}
```

dies ist mein code, in meinen augen perfekt 
aber wenn ich nun das ganze ausprobier funktionierts bei einigen flächen, bei anderen bekomme ich jedoch fehler und zwar superviele, also das kompilieren geht. aber eben beim ausführen/testen gehts nicht mehr. es gibt nur streifen, welche die farbe ändern und mitten drin brichts ab.
kann mir jemand helfen?


----------



## SlaterB (11. Nov 2009)

spannendes Problem, schade dass die anderen Klassen nicht dabei sind, da kann man nix ausprobieren,

> bei anderen bekomme ich jedoch fehler und zwar superviele

was denn genau, Exceptions, Text? wieso postest du das nicht hier

>  if ( (current.equals(rand)) && !(current.equals(fuell)) ){

die erste Bedingung reicht, es sei denn rand entspricht fuell, das kann man aber auch genau einmal vor dem Start der Rekursion testen, nicht für jeden Pixel


mein Rat:
- w.redraw(); einmal am Ende reicht doch, nicht nach jedem Pixel einzeln
- Loggen, Loggen, Loggen, (oder Debuggen)
erstelle dir ein kleines Testbild, 20x20, und darin auch nur eine zu färbende Fläche von höchsten 5x5,
und dann schaue dir genau an, was Fuellen macht, welche Pixel bearbeitet werden, ob nach dem Setzen der neuen Farbe später das equals klappt usw.

wenn es nur bei bestimmten Flächen zu Problemen kommt, dann suche dir davon eine möglichst kleine,
ansonsten halt viel loggen oder nach einem Teil der Fläche abbrechen usw., gibt so viele Möglichkeiten

- die Schleife in der main-Methode ist merkwürdig, obwohl denkbar,
was spricht gegen einen Listener, etwa den MouseListener der Imports?

prüfe auch per Logging, ob da bei längerem Drücken der Maus die ganze Aktion mehrmals gestartet wird oder so


----------



## faetzminator (11. Nov 2009)

Oder lass dir von den problematischen Strukturen alle Pixel (RGB Wert) ausgeben, ich kann mir vorstellen dass diese nicht immer genau gleich sind.


----------



## Marco13 (11. Nov 2009)

Diese "super vielen" Fehler klingen nach einem StackOverflowError. Schau mal hier http://www.java-forum.org/allgemein...on-schleifenkonstrukt-wandeln.html#post552766


----------

