Lernen des Cohen-Sutherland-Liniensegmentierungsalgorithmus und detaillierte Erklärung

Lernen des Cohen-Sutherland-Liniensegmentierungsalgorithmus und detaillierte Erklärung

【Zweidimensionales Linienschneiden】

Der Linienschnittalgorithmus verwendet eine Reihe von Tests und Schnittberechnungen, um zu bestimmen, ob das gesamte Liniensegment oder ein Teil davon gespeichert werden kann. Der Schnittpunkt des Liniensegments und der Fenstergrenze berechnet den zeitaufwändigen Teil der Linienbeschneidungsfunktion. Daher ist die Reduzierung der Schnittpunktberechnung das Hauptziel eines jeden Algorithmus zum Zuschneiden von Linien.

Zu diesem Zweck testen wir vor dem Schneiden, ob sich das Liniensegment vollständig innerhalb oder außerhalb des Zuschneidefensters befindet. Es ist leicht festzustellen, ob ein Liniensegment innerhalb des Fensters vollständig ist, es ist jedoch schwieriger festzustellen, ob ein Liniensegment außerhalb des Fensters vollständig niedriger ist.

Wenn Sie nicht feststellen können, ob sich ein Liniensegment vollständig innerhalb oder außerhalb des Fensters befindet, müssen Sie durch Berechnung des Schnittpunkts feststellen, ob ein Teil des Liniensegments in das Fenster fällt.

【Einführung in den Cohen-Sutherland-Algorithmus】

Der Cohen-Sutherland-Liniensegmentierungsalgorithmus ist ein weit verbreiteter Liniensegmentierungsalgorithmus. Der Algorithmus reduziert die Berechnung von Schnittpunkten durch anfängliche Tests, wodurch die vom Liniensegmentierungsalgorithmus verwendete Zeit reduziert wird.

Ode Algorithmus Endpunkt jedes Liniensegment genannten Ortsvorwahl vier Binärcode für jedes jeweilige Ende in Bezug auf die innerhalb oder außerhalb der Grenzen des Beschneidungsfensters zu identifizieren.

Das Folgende ist ein schematisches Diagramm eines Vier-Bit-Binärcodes. Im Allgemeinen ist er von links nach rechts mit 4321 nummeriert und entspricht dem oberen, unteren, rechten und linken Rand des Zuschneidefensters (beachten Sie, dass er nicht oben, unten, links und rechts ist).

Jede Grenze des Zuschneidefensters teilt den zweidimensionalen Raum in zwei Räume innerhalb und außerhalb des Fensters. Die vier Fenstergrenzen (die Linie, an der die Grenze liegt) teilen die Ebene in neun Bereiche, wie in der folgenden Abbildung gezeigt.

Endpunkte in neun verschiedenen Bereichen erhalten unterschiedliche Vorwahlen. Beispielsweise wird dem Endpunkt des Bereichs in der unteren linken Ecke des Zuschneidefensters eine Vorwahl von 0101 zugewiesen, während die Vorwahl des Endpunkts im Zuschneidefenster 0000 lautet.

Der Bitwert der Vorwahl wird durch Vergleichen der Koordinaten des Endpunkts (x, y) mit der Grenze des Zuschneidefensters bestimmt. Wenn x <xmin ist, ist Position 1 1, wie in dem Bereich mit den Vorwahlen 1001, 0001 und 0101 in der obigen Abbildung. Andere sind ähnlich.

Zusätzlich zur Verwendung des Ungleichheitstests können wir auch die Bitverarbeitungsoperation und die folgende zweistufige Operation verwenden, um den Wert der Vorwahl effizienter zu bestimmen:

(1) Berechnen Sie die Differenz zwischen den Koordinaten des Endpunkts und der Schneide.

(2) Verwenden Sie das durch jede Differenz berechnete Vorzeichenbit, um den entsprechenden Wert in der Vorwahl festzulegen.

In der Reihenfolge des obigen Binärcodediagramms wird Bit 1 auf das Vorzeichenbit von x-xw min gesetzt , Bit 2 wird auf das Vorzeichenbit von xw min -x gesetzt, Bit 3 wird auf das Vorzeichenbit von Bit y-yw min gesetzt ; Bit 4 wird auf yw min gesetzt -y Zeichenbit.

[Beschreibung des Cohen-Sutherland-Algorithmus]

Nachdem die Vorwahlen für alle Liniensegmentendpunkte festgelegt wurden, können Sie schnell feststellen, welches Liniensegment sich vollständig innerhalb des Zuschneidefensters und welches Liniensegment vollständig außerhalb des Fensters befindet.

① Das Liniensegment befindet sich vollständig im Fenster: Die Vorwahlen beider Endpunkte des Liniensegments sind 0000, und ein solches Liniensegment ist reserviert.

② Das Liniensegment befindet sich vollständig außerhalb des Fensters: Ein Paar derselben Position in den Vorwahlen der beiden Endpunkte des Liniensegments ist 1, und solche Liniensegmente werden verworfen.

Beispiel: Die Vorwahl eines Endpunkts des Liniensegments ist 1001, und die Vorwahl des anderen Endpunkts ist 0101. Dieses Liniensegment wird verworfen, da sich beide Endpunkte dieses Liniensegments auf der linken Seite des Zuschneidrechtecks ​​befinden, dem ersten Bit der Endpunkt-Vorwahl Sind alle 1.

Die Beurteilung, ob sich das Liniensegment innerhalb oder außerhalb des Fensters im Programm befindet, besteht darin, eine logische ODER- Operation an den Vorwahlen der beiden Endpunkte durchzuführen . Wenn das Operationsergebnis 0000 ist, befindet sich das Liniensegment vollständig im Zuschneidefenster. Behalten Sie dieses Liniensegment bei und testen Sie das nächste Liniensegment. Wenn das Ergebnis der logischen UND- Verknüpfung der Vorwahlen der beiden Endpunkte wahr ist (nicht 0000), bedeutet dies, dass sich das Liniensegment vollständig außerhalb des Fensters befindet und dieses Liniensegment verworfen wird.

③ Für das Liniensegment, das nicht vollständig außerhalb oder innerhalb des Fensters beurteilt werden kann, sollte der Schnittpunkt mit der Fenstergrenze getestet werden.

Diese Liniensegmente können durch das Innere des Fensters verlaufen oder nicht. Daher kann es mehrere Schnittvorgänge erfordern, um das Schneiden eines Liniensegments abzuschließen. Die Anzahl der Schnittpunkte hängt von der Reihenfolge der Auswahl der Schnittgrenze ab. Nachdem jedes Mal eine zugeschnittene Fenstergrenze verarbeitet wurde, wird ein Teil davon abgeschnitten und der Rest wird mit der anderen Fenstergrenze verglichen. Dieser Vorgang wird fortgesetzt, bis das Liniensegment vollständig abgeschnitten ist oder sich das verbleibende Liniensegment vollständig im Zuschneidefenster befindet.

Im Folgenden werden die beiden Liniensegmente in der folgenden Abbildung erläutert, die nicht sofort innerhalb / außerhalb des Fensters beurteilt werden können. Angenommen, die Reihenfolge der Fenstergrenzenverarbeitung ist links, rechts, unten und oben , um zu überprüfen, ob ein Liniensegment eine Beschneidungsgrenze schneidet, können Sie die entsprechenden Bits der Vorwahl an beiden Enden der Linie überprüfen. Schnittpunkt.

Wie oben gezeigt, sind P1P2 und P3P4 zwei Liniensegmente, die nicht sofort bestimmt werden können, ob sie sich innerhalb oder außerhalb des Fensters befinden. Erster Deal mit P1P2:

1. Verarbeitung am linken Rand:

Die Vorwahlen des Liniensegments P1 bis P2 sind 0100 und 1001. Daher befindet sich P1 innerhalb der linken Grenze und P2 außerhalb der linken Grenze.

Berechnen Sie als Nächstes den Schnittpunkt P2 'und schneiden Sie das Teil vom Punkt P2 auf P2'.

2. Verarbeitung am rechten Rand:

Das verbleibende Liniensegment befindet sich innerhalb der rechten Grenze und muss nicht verarbeitet werden.

3. Verarbeitung der unteren Grenze:

P1 befindet sich unterhalb der unteren Grenze und P2 'befindet sich oberhalb der unteren Grenze. Suchen Sie also den Schnittpunkt P1' an dieser Grenze und löschen Sie den Teil von P1 bis P1 '.

4. Verarbeitung der oberen Grenze:

Bestimmen Sie die Position des oberen Grenzschnittpunkts P2 '', schneiden Sie den Teil über der oberen Grenze ab und speichern Sie das innere Segment von P1 'bis P2' '.

Dann verarbeiten Sie P3P4:

Für das Liniensegment P3P4 liegt P3 außerhalb der linken Grenze und P4 innerhalb der linken Grenze. Berechnen Sie daher den Schnittpunkt P3 'und löschen Sie das Liniensegment von P3 nach P3'.

Durch Testen der Vorwahlen der Endpunkte P3 'und P4 befinden sich die verbleibenden Liniensegmente alle unterhalb des Zuschneidefensters, sodass sie gelöscht werden.


Referenzen:
1. "Computergrafik: Dritte Ausgabe" Cai Shijie usw. Übersetzte Electronic Industry Press 2010.7

                                </div>
Veröffentlicht 16 Originalartikel · Like1 · Besuche 180

Ich denke du magst

Origin blog.csdn.net/weixin_44931542/article/details/105562658
Empfohlen
Rangfolge