prev up inhalt next

Clipping von Linien

Zu einer Menge von Linien sind jeweils neue Anfangs- und Endpunkte zu bestimmen, welche komplett im Clip-Fenster liegen.


Abbildung 5.2: Ausgangslage beim Linien-Clipping

Idee von Cohen & Sutherland

Teile Ebene anhand des Clip-Fensters in 9 Bereiche ein, beschrieben durch 4-Bit-Bereichscode:


Abbildung 5.3: Bereichscodes nach Cohen & Sutherland

Bit 0: links vom Fenster
Bit 1: rechts vom Fenster
Bit 2: unter dem Fenster
Bit 3: über dem Fenster
   

Sei $\overline{P_{1} P_{2}}$ eine Linie. Dann gilt bei einer bitweisen Verknüpfung:

code $(P_{1})$ AND code $(P_{2} ) \neq 0
\Rightarrow \overline{P_{1} P_{2}}$ komplett außerhalb (beide Punkte auf derselben Seite)

code $(P_{1})$ OR code $(P_{2} ) = 0
\Rightarrow \overline{P_{1} P_{2}}$ komplett innerhalb (beide Punkte im Clip-Fenster)

In den anderen Fällen wird $\overline{P_{1} P_{2}}$ mit einer Fensterkante geschnitten und der Test mit der verkürzten Linie erneut ausgeführt.


Abbildung 5.4: Möglichkeiten bei zwei außerhalb liegenden Punkten

private static final byte CENTER  = 0;
private static final byte LEFT    = 1;
private static final byte RIGHT   = 2;           // 4-Bit-Bereichscodes
private static final byte BOTTOM  = 4;
private static final byte TOP     = 8;

/** 
 *  Liefert den region code fuer den uebergebenen Punkt
 *  
 *  @param x Die x-Koordinate des zu testenden Punktes
 *  @param y Die y-Koordinate des zu testenden Punktes
 *
 *  @return Der region code in einem Byte kodiert
 */
public byte region_code(int x, int y) {
  byte c = CENTER;                               // zunaechst: im Zentrum

  if (x < xmin)                                  // falls links vom Fenster
    c = LEFT;                                    // links vermerken
  else                                           // falls nicht links
    if (x > xmax)                                // falls rechts vom Fenster
      c = RIGHT;                                 // rechts vermerken

  if (y < ymin)                                  // falls oberhalb
    c |= TOP;                                    // oberhalb hinzufuegen
  else                                           // falls nicht oberhalb
    if (y > ymax)                                // falls unterhalb
      c |= BOTTOM;                               // unterhalb hinzufuegen

  return c;                                      // region code zurueck
}


prev up inhalt next