L
Hallo Gregor,
danke für deinen Tipp, ich habe mal gegoogeld, aber das was ich gefunden habe, habe ich nicht verstanden
Ich habe mir das nochmal mim Stack angeschaut und hab jetzt mal ausgeschlossen, dass ein Pixel mehr als einmal auf dem Stack landet. Das Funktioniert auch wunderbar. Allerdings ist wohl das problem, wesegen der Heap voll läuft, ein anderes: Ich habe mir mal ausgeben lassen, die Stackgröße und den Pixel, den er bei jedem durchlauf bearbeitet. Manchmal, nciht immer, hängt der sich sozusagen auf, und wechelst immer zwischen zwei Pixeln hin und her und der Stack wird deshalb halt nie leer. Ich habe bis jetzt noch nicht den Bug gefunden, vielleicht sieht ihn ja jemand auf den "ersten Blick". hier der Code:
public class Fill
{
/*...*/
private boolean istImStack(Pixel p, Stack s)
{
for(int i=0; i<s.size(); ++i)
{
if(((Pixel)s.get(i)).equals(p))
return true;
}
return false;
}
private boolean istImBild(Pixel p)
{
return !(p.getX()<0 || p.getY()<0 || p.getX()>=this.image.getWidth() || p.getY()>=this.image.getHeight());
}
private void paintAndProgress(Pixel first)
{
int x, y;
Pixel p, t;
this.refIntColor=this.image.getRGB(first.getX(), first.getY());
this.graphics.setColor(this.color);
this.stack=new Stack();
this.stack.push(first);
while(!this.stack.empty())
{
x=((Pixel)this.stack.peek()).getX();
y=((Pixel)this.stack.peek()).getY();
this.graphics.fillRect(x, y, 1, 1);
t=(Pixel)this.stack.pop();
/* Ein neuer Pixel wird nur dann darauf gelegt, wenn sich dieser
weder im Stack befindet, der gleiche Pixel ist, wie der ursprüngliche,
noch außerhalb des Bildes befindet und eben die entsprechende Farbe
besitzt.
*/
// Links
p=new Pixel(x-1, y);
if(!t.equals(p) && !this.istImStack(p, stack) && this.istImBild(p) && this.refIntColor==this.image.getRGB(p.getX(), p.getY()))
this.stack.push(p);
// Oben
p=new Pixel(x, y-1);
if(!t.equals(p) && !this.istImStack(p, stack) && this.istImBild(p) && this.refIntColor==this.image.getRGB(p.getX(), p.getY()))
this.stack.push(p);
// Rechts
p=new Pixel(x+1, y);
if(!t.equals(p) && !this.istImStack(p, stack) && this.istImBild(p) && this.refIntColor==this.image.getRGB(p.getX(), p.getY()))
this.stack.push(p);
// Unten
p=new Pixel(x, y+1);
if(!t.equals(p) && !this.istImStack(p, stack) && this.istImBild(p) && this.refIntColor==this.image.getRGB(p.getX(), p.getY()))
this.stack.push(p);
}
}
/*...*/
}
Kann jemand helfen?
Beste Grüße
Jan