Alpha Clipping

Window Edge Koordinaten

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Alpha Clipping
Hey,

Kann mir jemand Alpha-Clipping erklären? Insbesonder die Window Edge Koordinaten versteh ich nicht… Folien 24/25 in diesem Skript: http://lgdv.cs.fau.de/get/2009

Danke :slight_smile:


Die WEC enthalten den (vorzeichenbehafteten) Abstand zum linken/rechten/oberen/unteren Rand, wobei die Vorzeichen so gewählt sind, dass negative Werte außen liegen. (darum auch signbit = outcode) Das kann man so einfach mit den Formeln auf s. 24 berechnen, weil du immer gegen ein axis-aligned Rechteck clipst, dessen Seiten parallel / senkrecht zu den Koordinatenachsen stehen.

Das alpha beschreibt den Anteil, den die Strecke P_1S (Strecke vom ersten Punkt der zu clippenden Linie zum Schnittpunkt der Linie mit der Kante) an der gesamten zu clippenden Linie hat, also P_1S / P_1P_2.

Das alpha kannst du jetzt auch mit WECs berechnen, siehe dazu das Bild auf Folie 25: Die Streckenverhältnisse entlang der beliebig schrägen, zu clippenden Linie stimmen mit dem Verhältnis entlang der Koordinaten-Achse / entlang der WECs überein [WEC_E(P_1) zur Summe der Abstände]:
WEC_E(P_1) / WEC_E(P_1) - WEC_E(P_2)
Das Minuszeichen im Nenner ist vielleicht etwas verwirrend, liegt aber daran, dass die WECs eben vorzeichenbehaftete Abstände sind, die (weil P_1 und P_2 auf unterschiedlichen Seiten der Linie liegen) genau unterschiedliche Vorzeichen haben.

Hypothetisch:
Punkt S erhälst du dann über P_1 + alpha*(P_2 - P_1). Dann ersetzt du den vorher außen liegenden Punkt mit S, dadurch schneidet die verkürzte Linie die eben behandelte Kante der Clipping Plane nicht mehr.
Dann machst du mit der nächsten Kante weiter, nach maximal 4 Schritten hast du die Linie auf den Bereich innerhalb der Clipping Plane reduziert oder es lagen irgendwann mal beide Punkte außerhalb der selben Kante, dann wurde mit trivial reject abgebrochen.

Tatsächlich ist der Witz an den alphas, dass du S gar nicht mehr ausrechnen musst. Du behälst einfach alpha_min (der Wert, um den P_1 nach innen rutscht) und alpha_max (der Wert, um den P_2 nach innen rutscht). Sobald alpha_max <= alpha_min bleibt gar keine Strecke mehr übrig und du kannst aufhören. Ansonsten berechnest du am Ende nur die 2 richtigen Schnittpunkte.


Einsah!

Vorallem die Erklärung, dass WEC_left, WEC_right… usw für die Kanten stehen und dass px für den X-Wert des des Punktes stehen haben mir auf die Sprünge geholfen!!! Danke!

(das px für den X-Wert steht hast du garnet erklärt^^ Aber hab’s mir aus dem Rest deiner Erklärung hergeleitet… Vielleicht wäre da eine ander Schreibweise Hilfreich z.B.: P.x oder P_x oder statt xmin x_min…)