o | ||
o | o | |
o | ||
o | o | o |
o | o | |
o | o | o |
Ausgehend vom Startpunkt ( x,y ) werden so lange die 4-way-stepping-Nachbarn gefärbt, bis die Umgrenzung erreicht ist.
o | ||||
o | o | |||
Wird hingegen die Nachbarschaft über 8-way-stepping definiert, so ``läuft die Farbe aus'':
o | |||
o | |||
Benötigt werden
boolean get_pixel ( // liefert true, wenn Pixel p
Point p) // die Vordergrundfarbe hat
und
boolean range_ok ( // liefert false, wenn Pixel p
Point p) // ausserhalb des Bildbereichs
Der Nachteil der sehr ineffizienten Methode boundary_fill liegt darin, daß für jedes Pixel innerhalb der Begrenzungskurve(n) (mit Ausnahme der Randpixel des inneren Gebiets) der Algorithmus viermal aufgerufen wird. Dadurch werden die Pixel mehrfach auf dem Stapel abgelegt.
/****************************************************************************************/
/* */
/* Fuellen einer durch Vordergrundfarbe umrandeten Flaeche */
/* */
/****************************************************************************************/
private void boundary_fill( // setzt alle Nicht-Vordergrund-Pixel
Point p) // beginnend bei Position p auf Vordergrund
{
if ( range_ok(p) && !get_pixel(p) ) { // falls p keine Vordergrundfarbe hat
set_pixel(p); // setze Vordergrundfarbe
boundary_fill( new Point(p.x+1, p.y )); // 4-way stepping
boundary_fill( new Point(p.x, p.y+1 ));
boundary_fill( new Point(p.x-1, p.y ));
boundary_fill( new Point(p.x, p.y-1 ));
}
}
/****************************************************************************************/
/* */
/* Leeren einer durch Vordergrundfarbe definierten Flaeche */
/* */
/****************************************************************************************/
private void boundary_empty( // setzt alle Vordergrund-Pixel beginnend
Point p) // bei Position p auf Hintergrundfarbe
{
if ( range_ok(p) && get_pixel(p) ) { // falls p Vordergrundfarbe hat
del_pixel(p); // setze Hintergrundfarbe
boundary_empty( new Point( p.x+1, p.y )); // 8-way-stepping
boundary_empty( new Point( p.x+1, p.y+1 ));
boundary_empty( new Point( p.x, p.y+1 ));
boundary_empty( new Point( p.x-1, p.y+1 ));
boundary_empty( new Point( p.x-1, p.y ));
boundary_empty( new Point( p.x-1, p.y-1 ));
boundary_empty( new Point( p.x, p.y-1 ));
boundary_empty( new Point( p.x+1, p.y-1 ));
}
}