www.wikidata.de-de.nina.az
Der Algorithmus von Cohen Sutherland ist ein Algorithmus zum Abschneiden Clipping von Linien an einem Rechteck Er ist nach seinen Erfindern Danny Cohen und Ivan Sutherland benannt Der Algorithmus gilt als popularster wenn auch nicht effizientester fur seine Zwecke Er eignet sich besonders fur Falle in denen ein hoher Anteil der zu clippenden Linien inner oder ausserhalb des Rechtecks liegt Schritte BearbeitenZuerst werden jeweils fur die beiden Endpunkte der zu zeichnenden Linie vier Flags ermittelt die gesetzt werden wenn sich der Endpunkt links des Rechtecks rechts davon darunter oder daruber befindet Ist keines der Flags gesetzt dann liegen beide Endpunkte innerhalb des Rechtecks es ist kein Clipping notwendig und die Linie kann einfach gezeichnet werden nbsp Illustration Clipping MaskeWenn dieser triviale Fall nicht eintritt werden im nachsten Schritt die einander entsprechenden Flags beider Endpunkte angesehen Ist mindestens eines dieser Flags bei beiden Endpunkten gesetzt so befindet sich die gesamte Linie ausserhalb des Rechtecks und die Linie braucht nicht gezeichnet zu werden Wenn auch dieser einfache Fall nicht auftritt wird der Schnittpunkt einer beliebigen Rechteck Seite mit dem Liniensegment berechnet und der uberlappende Teil erneut getestet und eventuell gekurzt bis schliesslich beide Punkte innerhalb des Rechtecks liegen Implementierung BearbeitenDas folgende Programm gibt ein Beispiel einer Implementierung des Cohen Sutherland Algorithmus in C anhand dessen man die Funktionsweise gut nachvollziehen kann Clipping der zwei X Y Koordinaten einer Linie innerhalb eines zweidimensionalen Clipping Rechtecks XMin YMin XMax YMax nach Cohen Sutherland Nach Ablauf der Funktion sind die Koordinaten der beiden Punkte so geclippt dass sie innerhalb des Clipping Rechtecks liegen und der Linie entsprechen die ubrig bleibt wenn man die ausserhalb liegenden Teile abschneidet Falls kein Teil der Linie das Clipping Rechteck uberstreicht liefert die Funktion den Wert FALSE zuruck x1 y1 Koordinate des Anfangspunktes der Linie x2 y2 Koordinate des Endpunktes der Linie return FALSE Linie ist komplett geclippt und braucht nicht gezeichnet zu werden TRUE Die Koordinaten sind geclippt und die Linie kann jetzt gezeichnet werden define CLIPLEFT 1 Binar 0001 define CLIPRIGHT 2 0010 define CLIPLOWER 4 0100 define CLIPUPPER 8 1000 bool clipline int amp x1 int amp y1 int amp x2 int amp y2 int K1 0 K2 0 Variablen mit je 4 Flags fur rechts links oben unten int dx dy dx x2 x1 Die Breite der Linie vorberechnen fur spatere Koordinaten Interpolation dy y2 y1 Die Hohe der Linie vorberechnen fur spatere Koordinaten Interpolation Die folgende Abfrage setzt die Flags CLIPLEFT CLIPRIGHT CLIPUPPER CLIPLOWER falls die Koordinate auf einer oder zwei Seiten ausserhalb des Clip Rechtecks liegt Ein Punkt kann nicht gleichzeitig rechts und links bzw oben und unten ausserhalb liegen daher konnen nur maximal 2 Flags gesetzt sein Es gibt 9 Moglichkeiten Davon sind 8 ungleich 0 und zeigen an dass die Koordinate geclippt werden muss if y1 lt YMin K1 CLIPLOWER Ermittle wo der Anfangspunkt ausserhalb des Clip Rechtecks liegt if y1 gt YMax K1 CLIPUPPER Es werden entweder CLIPLOWER oder CLIPUPPER und oder CLIPLEFT oder CLIPRIGHT gesetzt if x1 lt XMin K1 CLIPLEFT Es gibt 8 zu clippende Kombinationen je nachdem in welchem der 8 angrenzenden if x1 gt XMax K1 CLIPRIGHT Bereiche des Clip Rechtecks die Koordinate liegt if y2 lt YMin K2 CLIPLOWER Ermittle wo der Endpunkt ausserhalb des Clip Rechtecks liegt if y2 gt YMax K2 CLIPUPPER Wenn keines der Flags gesetzt ist dann liegt die Koordinate if x2 lt XMin K2 CLIPLEFT innerhalb des Rechtecks und muss nicht geandert werden if x2 gt XMax K2 CLIPRIGHT Schleife nach Cohen Sutherland die maximal zweimal durchlaufen wird while K1 K2 muss wenigstens eine der Koordinaten irgendwo geclippt werden wenn beide Koordinaten entweder links rechts uber oder unter dem Clipping Rechteck liegen ist kein Teil der Linie sichtbar daher ist keine weitere Berechnung notwendig Die geclippte Linie ist unsichtbar if K1 amp K2 logisches AND der beiden Koordinaten Flags ungleich 0 return FALSE beide Punkte liegen jeweils auf der gleichen Seite ausserhalb des Rechtecks if K1 schnelle Abfrage muss Koordinate 1 geclippt werden if K1 amp CLIPLEFT ist Anfangspunkt links ausserhalb ja y1 XMin x1 dy dx berechne y1 durch lineare Interpolation dx kann hier nie 0 sein x1 XMin setze x1 an den linken Rand des Clip Rechtecks else if K1 amp CLIPRIGHT ist Anfangspunkt rechts ausserhalb ja y1 XMax x1 dy dx berechne y1 durch lineare Interpolation dx kann hier nie 0 sein x1 XMax setze x1 an den rechten Rand des Clip Rechtecks if K1 amp CLIPLOWER ist Anfangspunkt unterhalb des Rechtecks ja x1 YMin y1 dx dy berechne x1 durch lineare Interpolation dy kann hier nie 0 sein y1 YMin setze y1 an den unteren Rand des Clip Rechtecks else if K1 amp CLIPUPPER ist Anfangspunkt oberhalb des Rechtecks ja x1 YMax y1 dx dy berechne x1 durch lineare Interpolation dy kann hier nie 0 sein y1 YMax setze y1 an den oberen Rand des Clip Rechtecks K1 0 Erst davon ausgehen dass der Punkt jetzt innerhalb liegt falls das nicht zutrifft wird gleich korrigiert if y1 lt YMin K1 CLIPLOWER ermittle erneut wo der Anfangspunkt jetzt ausserhalb des Clip Rechtecks liegt if y1 gt YMax K1 CLIPUPPER Fur einen Punkt bei dem im ersten Durchlauf z B CLIPLEFT gesetzt war if x1 lt XMin K1 CLIPLEFT kann im zweiten Durchlauf z B CLIPLOWER gesetzt sein if x1 gt XMax K1 CLIPRIGHT muss hier nochmal getestet werden sonst werden Linien die uber Eck ausserhalb liegen nicht korrekt behandelt if K1 amp K2 logisches AND der beiden Koordinaten Flags ungleich 0 return FALSE beide Punkte liegen jeweils auf der gleichen Seite ausserhalb des Rechtecks if K2 schnelle Abfrage muss Koordinate 2 geclippt werden ja if K2 amp CLIPLEFT liegt die Koordinate links ausserhalb des Rechtecks ja y2 XMin x2 dy dx berechne y durch lineare Interpolation dx kann hier nie 0 sein x2 XMin setze die x Koordinate an den linken Rand else if K2 amp CLIPRIGHT liegt die Koordinate rechts ausserhalb des Rechtecks ja y2 XMax x2 dy dx berechne y durch lineare Interpolation dx kann hier nie 0 sein x2 XMax setze die x Koordinate an den rechten Rand if K2 amp CLIPLOWER liegt der Endpunkt unten ausserhalb des Rechtecks ja x2 YMin y2 dx dy berechne x durch lineare Interpolation dy kann hier nie 0 sein y2 YMin setze die y Koordinate an den unteren Rand else if K2 amp CLIPUPPER liegt der Endpunkt oben ausserhalb des Rechtecks ja x2 YMax y2 dx dy berechne x durch lineare Interpolation dy kann hier nie 0 sein y2 YMax setze die y Koordinate an den oberen Rand K2 0 Erst davon ausgehen dass der Punkt jetzt innerhalb liegt falls das nicht zutrifft wird gleich korrigiert if y2 lt YMin K2 CLIPLOWER ermittle erneut wo der Endpunkt jetzt ausserhalb des Clip Rechtecks liegt if y2 gt YMax K2 CLIPUPPER Ein Punkt der z B zuvor uber dem Clip Rechteck lag kann jetzt entweder if x2 lt XMin K2 CLIPLEFT rechts oder links davon liegen Wenn er innerhalb liegt wird kein if x2 gt XMax K2 CLIPRIGHT Flag gesetzt Ende der while Schleife die Schleife wird maximal zweimal durchlaufen return TRUE jetzt sind die Koordinaten geclippt und die gekurzte Linie kann gezeichnet werden Weblinks BearbeitenBeschreibung englisch JavaScript Implementierung mit Quelltext Java Applet Abgerufen von https de wikipedia org w index php title Algorithmus von Cohen Sutherland amp oldid 239314235