next up previous contents
Next: 3.2.2 Integration getrimmter Funktionen Up: 3.2 Funktionen auf getrimmten Previous: 3.2 Funktionen auf getrimmten   Inhalt

3.2.1 Darstellung getrimmter Funktionen

Der Algorithmus zur Darstellung von Funktionen auf getrimmten Flächen entspricht im Prinzip dem zur Darstellung der Fläche selbst. Nur zeichnen wir anstatt der Fläche die Funktion in Abhängigkeit von den ausgewählten Darstellungsarten. Pro Punkt der Fläche müssen wir zusätzlich überprüfen, ob er durch eine Trimmkurve im Parameterbereich oder durch eine implizite Funktion im R^3 ausgeschnitten wird.

Bei Isolinien gehen wir nicht ganz so direkt vor. Für Quadrate im Parameterbereich der Fläche, die in keinem Trimmbereich liegen, können wir den Algorithmus isolines mit entsprechenden Argumenten aufrufen. Wir verwenden also die Tests aus dem Algorithmus trimmed_bezier, um den Parameterbereich in Quadrate zu zerlegen, die entweder im Trimmbereich oder außerhalb des Trimmbereiches liegen und rufen dann entsprechend isolines auf.

Abbildung 3.11: Funktion auf einer getrimmten Fläche mit einer Irregularität der Ordnung 3
Funktion auf einer getrimmten Fläche mit einer Irregularität

Abbildung 3.12: Funktion auf dem getrimmten Würfel
Funktion auf dem getrimmten Würfel



Algorithmus 3.4  
trimmed_isolines
Zeichnen von Isolinien auf einem getrimmten Bézierflächenstück
1.
Lege über das Intervall [u0,u1]x[v0,v1] ein Gitter mit resolution^2 Punkten und prüfe, ob die Gitterknoten innerhalb oder außerhalb der Trimmbereiche liegen:
(a)
Initialisiere ein zwei-dimensionales boolean Array b0 für die resolution^2 Gitterpunkte mit false. Es wird true für ausgeschnittene und false für die anderen Gitterpunkte sein.
(b)
Prüfe für jeden Gitterpunkt mit den Koordinaten (u,v) = (u0 + ui * (u1-u0)/(resolution - 1) , v0 + vi * (v1 - v0)/(resolution - 1)), wobei ui und vi die Position im b0 Array festlegen und jeweils von 0 bis resolution-1 hochgezählt werden, ob sie in einem Trimmbereich liegen:
i.
Zähle die Anzahl der Trimmbereiche, die die Koordinaten (u,v) des Knotens enthalten, mit Hilfe des Algorithmus' trimmcurve_test. Die zu dem Bézierflächenstück gehörenden Trimmkurven müssen vorher bekannt sein.
ii.
Ist die Anzahl ungerade, dann setze b0 für diesen Gitterpunkt auf true.
iii.
Überprüfe, ob der zu (u,v) gehörende Punkt auf dem Bézierflächenstück wenigstens eine der impliziten Trimmfunktionen erfüllt. Ist dies der Fall, setze b0 für diesen Gitterpunkt auf true.
2.
Bearbeite jedes Quadrat im Parameterbereich, das durch die zwei Gitterknoten mit den Indizes [ui,vi] und [ui+1,vi+1] bzgl. b0 bestimmt ist, um die zugehörigen Isolinien zu zeichnen:
(a)
Liegt wenigstens eine der Ecken des Quadrats laut b0 in einem Trimmbereich, dann rufe trimmed_isolines rekursiv für dieses Quadrat auf. Falls dies die maximale Rekursionstiefe überschreiten würde, tue nichts.
(b)
Liegt keine der Ecken in einem Trimmbereich, dann rufe isolines für dieses Quadrat auf, um die Isolinien zu zeichnen.



Abbildung 3.13: Isolinien auf der aufgeschnittenen, verdrehten Acht
Isolinien auf der aufgeschnittenen, verdrehten Acht

trimmed_isolines wird mit einer Liste der Trimmkurven aufgerufen, die zu dem jeweiligen Bézierflächenstück gehören. Beim ersten Aufruf wählen wir normalerweise das Einheitsquadrat als Parameterbereich und die Rekursionstiefe ist 0. Der erste Teil entspricht natürlich genau dem schon bekannten Testalgorithmus für das Trimming. Nur im zweiten Teil wird isolines mit den entsprechenden Parametern aufgerufen, um die Isolinien zu zeichnen. Obiger Algorithmus führt nur die Unterteilung des Parameterbereiches durch, bis ein gesamtes Quadrat außerhalb oder innerhalb der Trimmbereiche liegt und verwendet dann den Algorithmus für nicht getrimmte Flächen, der mit einer entsprechend großen Rekursionstiefe aufgerufen wird.

Sobald eines der Quadrate vollständig außerhalb des Trimmbereiches liegt, werden über isolines die zugehörigen Isolinien gezeichnet. Liegt ein Quadrat teilweise in einem Trimmbereich, dann wird der Algorithmus rekursiv aufgerufen. Wurde im Algorithmus trimmed_isolines die maximale Rekursionstiefe erreicht, werden die Quadrate, bei denen wenigstens ein Punkt des Parameterbereiches im Trimmbereich liegt, nicht weiter behandelt. Dabei verlieren wir die Isolinien auf den Dreiecken am Rand der Trimmbereiche. Bei feinen Auflösungen ist dies allerdings zu vernachlässigen. Ansonsten könnte man hier noch eine spezielle Version von handle_quad verwenden, die nur ein Dreieck berücksichtigt.

Abbildung 3.11 zeigt eine G-Spline-Fläche mit einer Irregularität der Ordnung 3. An den drei Kontrollpunkten dieser Irregularität wurde ein kreisähnlicher Trimmbereich über quadratische Trimmkurven ausgeschnitten. Die Fläche selbst ist transparent und hinter ihr stellen wir eine Funktion auf dieser Fläche durch eine farbige Fläche, Stacheln und ein Gitter dar. In Abbildung 3.12 wird eine Funktion auf dem transparenten getrimmten Würfel auf die gleiche Weise dargestellt.

In Abbildung 3.13 ist die verdrehte Acht mit Isolinien aus der Abbildung 2.19 zu sehen. Wir haben sie durch eine implizite Funktion aufgeschnitten. Die Isolinien wurden sowohl etwas oberhalb, als auch etwas unterhalb der Fläche gezeichnet.


next up previous contents
Next: 3.2.2 Integration getrimmter Funktionen Up: 3.2 Funktionen auf getrimmten Previous: 3.2 Funktionen auf getrimmten   Inhalt
Copyright © 1999-2002 Frank C. Langbein. All rights reserved.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation.

Contact: webmaster@langbein.org
URI: http://www.langbein.org/fileadmin/research/surfaces/diploma/HTML/node28.html