logo_90
Uni ZH
Informatikdienste
PostScript

Bézier-Kurven

Die kubische Bezier-Kurve ist grundsätzlich das wichtigste grafische Element, weil fast alle Formen und Zeichenumrisse aus Bezier-Segmenten zusammengesetzt werden können. Betrachten Sie die folgende Abbildung einer Bezier-Kurve: BEZIER2

Abbildung: Der Operator curveto konstruiert eine geglättete Kurve; die Kurve geht vom Punkt "0" zum Punkt "3", die Bezier-Kontrollpunkte (BCP) sind mit "1" und "2" markiert.

Die Gestalt einer kubischen Bezier-Kurve wird durch den Start- und Endpunkt (Punkt 0 bzw. 3) und durch die Bezier-Kontrollpunkte (BCP) ausserhalb der Kurve (Punkte 1 und 2) bestimmt. Für Mathematiker: eine Bezier-Kurve ist eine kubische Kurve, die jedoch eine Ueberschneidung zulässt. Die im obigen Beispiel gestrichelten Geraden von Punkt 0 nach Punkt 1 sowie von Punkt 2 nach Punkt 3 bilden Tangenten durch Anfangs- bzw. Endpunkt der Bezier-Kurve. Das Polygon, welches durch die vier Punkte gebildet wird, schliesst immer die Bezier-Kurve vollständig ein (rubberband). Näheres dazu in: Foley et al.: Computer Graphics, Addison-Wesley 1990, pp 488; die math. Formel folgt unten:

Pierre Bézier beschreibt die nach ihm benannte Kurve mit folgender kubischen Formel:

X(u) = x0 (1-u)hoch3 + x1 3u (1-u)hoch2 + x2 3uhoch2 (1-u) + x3 uhoch3

Y(u) = y0 (1-u)hoch3 + y1 3u (1-u)hoch2 + y2 3uhoch2 (1-u) + y3 uhoch3

Dabei sind (x0,y0): Startpunkt; (x1,y1), (x2,y2): zwei Bezier-Kontrollpunkte (BCP's) ausserhalb der Kurve; und (x3,y3): Endpunkt der Kurve. Der Wert 0<=u<=1 ist der Parameter der Darstellung und wird entlang der Kurve ständig etwas erhöht.

Die meisten grafischen Formen und Schriftzeichen werden mit Bezier-Kurven beschrieben -- ausser man hat es ausschliesslich mit geraden Strichen und Rechtecken zu tun. Ein Beispiel:

% Es folgen zwei Bezier-Kurven: 
-1.0 1.0 0.0 2.0 1.0 1.0 rcurveto 
					% Rundung links
1.0 1.0 2.0 0.0 1.0 -1.0 rcurveto 
					% Rundung rechts
Zwei Bezier-Kurven; diese Bounding-Box, die auch die BCP's einschliesst, ist doppelt so breit wie hoch.

Die Syntax von curveto lautet:

	x1 y1 x2 y2 x3 y3 curveto
Dabei wird dem aktuellen Pfad ein Segment hinzugefügt, das von der aktuellen Position zum Punkt (x3,y3) geht und dabei die Punkte (x1,y1) und (x2,y2) als BCP's verwendet. Nach der Ausführung des Operators wird der Punkt (x3,y3) zur aktuellen Position. Bei rcurveto werden die werden die Pfade nicht in absoluten Koordinaten (ausgehend vom Ursprung), sondern in relativen Bewegungen angegeben (ausgehend von der aktuellen Position).

Zur Verdeutlichung sehen Sie die Abbildung nochmals, und zwar mit den Tangenten: BEZIER4

Abbildung: Zwei Bezier-Kurven; mit Koordinatengitter und Tangenten. Beachten Sie, dass der Umriss im Uhrzeigersinn gezeichnet wird.

Flächen

Bei geglätteten Uebergängen ist es nun so, dass auf einer bestimmten Tangente einerseits ein Bezier-Kontrollpunkt des Segmentes a und andererseits ein Bezier-Kontrollpunkt des Segmentes b liegen. Dies garantiert einen sanften Uebergang zwischen zwei Bezier-Segmenten.

Wenn ein geschlossener Pfad gebildet ist, können Sie die Fläche mit einer Farbe füllen. Dabei legt das Imaging-Modell fest, dass ein darunter liegendes Objekt überdeckt würde.

Zwei verschiedene Regeln (winding number fill und even-odd fill) sorgen dafür, dass z.B. der Kern des Buchstabens "O" nicht auch geschwärzt wird. Bei beiden Regeln kommt es darauf an, welche Richtung die Pfade haben. Bleiben wir beim Herz als Beispiel: wenn der äussere Pfad im Uhrzeigersinn gezeichnet ist, dann müssen Sie ein Loch im Gegenuhrzeigersinn zeichnen.

Abbildung: Herz mit Loch.

Nachdem der Umrisspfad im Uhrzeigersinn definiert und mit closepath abgeschlossen ist, konstruieren wir ein Rechteck im Gegenuhrzeigersinn:

200 350 moveto

... Herz-Umriss ...

closepath

200 400 moveto
% jetzt das Loch im Gegenuhrzeigersinn: 
10 neg 0 rlineto 0 10 neg rlineto 10 0 rlineto
closepath
fill
Der Operator fill füllt im Beispiel die Fläche, lässt aber das Rechteck leer.

Uni ZH | Informatikdienste | PostScript
Last update: Saturday, 01-Jan-2005 17:50:12 CET by vo