prev up inhalt next


4.1 Universelle Füll-Verfahren

Nachbarn zu im 4-way-stepping:
  o  
o o
  o  
     
Nachbarn zu im 8-way-stepping:
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.

Vorteil:
beliebige Umrandung möglich
Nachteil:
hoher Rechen- und Speicherbedarf
Obacht:
Gebiete, die nur durch 8-way-stepping erreicht werden können, werden beim Füllen mit 4-way-stepping ``vergessen'':
   
     
     
  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 ));

        }
}


prev up inhalt next