Bézierkurve

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Die Bézierkurve [be'zje…] ist in der numerischen Mathematik eine parametrisch modellierte Kurve, die ein wichtiges Werkzeug für Vektorgrafiken darstellt.

In der Computergrafik sind Bézierkurven wegen ihrer geometrischen Eleganz und mathematischen Leichtigkeit beliebt. Eine Bézierkurve am Bildschirm besteht, vereinfacht ausgedrückt, statt aus vielen Pixeln aus einer relativ einfachen Formel. In der Computergrafik werden Bézierkurven zur Definition von Kurven und Flächen im Rahmen von CAD, bei Vektorgrafiken (z. B. SVG) und zur Beschreibung von Schriften (z. B. Postscript Type1, TrueType und CFF-OpenType) verwendet.

Sie wurde Anfang der 1960er Jahre unabhängig voneinander von Pierre Bézier bei Renault und Paul de Casteljau bei Citroën für Computer-Aided Design (computerunterstützte Konstruktion) entwickelt. Paul de Casteljau gelang zwar die Entdeckung früher, Citroën hielt seine Forschungen jedoch bis zum Ende der 1960er Jahre als Betriebsgeheimnis zurück.

Kubische Bézierkurve

Definition[Bearbeiten]

Konstruktion einer kubischen Bézierkurve

Eine Bézierkurve n-ten Grades zu gegebenen n+1 Kontroll- oder Bézierpunkten P_0,P_1,\dotsc,P_n, die das so genannte Kontrollpolygon bilden, ist für t \in [0,1] definiert als

C(t)= \sum_{i=0}^n B_{i,n}(t) P_i\,,

wobei

B_{i,n}(t)= \binom n i t^i (1-t)^{n-i}

das i-te Bernsteinpolynom n-ten Grades ist. Diese bilden eine Basis des Vektorraums der Polynome und erfüllen die Rekursionsformel

B_{i,n}(t) = (1-t) \cdot B_{i,n-1}(t) \,+\, t \cdot B_{i-1,n-1}(t)

mit B_{i,n} := 0 für i < 0 oder i > n, sowie  B_{0,0} := 1. Dies erlaubt eine numerisch stabile rekursive Berechnung der Werte einer Bézierkurve mit Hilfe des De-Casteljau-Algorithmus:

\begin{align}
C_i^0(t) & \;:=\; P_i \\
C_i^j(t) & \;:=\; (1-t)C_i^{j-1}(t) \,+\,  tC_{i+1}^{j-1}(t)
\quad\text{mit}\quad j=1, \ldots ,n \quad\text{und}\quad i=0,\ldots,n-j
\end{align}

Eigenschaften[Bearbeiten]

Bézierkurven der Grade 1, 2 und 3 (rot) und die zugehörigen Kontrollpolygone (grau). Von links nach rechts wurde jeweils ein weiterer Kontrollpunkt (blau) hinzu­gefügt. Man erkennt, wie die Kurve bei Einfügen/Verändern eines Kontrollpunkts „oszilliert“, d. h., ihre Richtung und Krümmung verändert.
 1 = \sum_{i=0}^n B_{i,n}(t) \quad t \in [0,1]
  • Die Kurve geht genau durch die Endpunkte P_0 und P_n:
 \begin{align}
    C(0) \; & = \; \sum_{i=0}^n \binom n i 0^i(1-0)^{n-i} P_i\\
            & = \; P_0 \\
    C(1) \; & = \; P_n
\end{align}
  • Die Tangenten in den Endpunkten verlaufen entlang der Kanten P_0 P_1 bzw. P_{n-1} P_n des Kontrollpolygons:
\begin{align}
C'(0) \;&=\; n \, (P_1 - P_0)\\
C'(1) \;&=\; n \, (P_n - P_{n-1})
\end{align}
C(t)=P_{0}+n(P_{1}-P_{0})t+\frac{n(n-1)}{2}(P_{0}-2P_{1}+P_{2})t^{2}+\mathcal{O}(t^{3})
C(t)=P_{n}+n(P_{n-1}-P_{n})(1-t)+\frac{n(n-1)}{2}(P_{n-2}-2P_{n-1}+P_{n})(1-t)^{2}+\mathcal{O}((1-t)^{3})
  • Eine Gerade schneidet eine Bézierkurve höchstens so oft, wie sie ihr Kontrollpolygon schneidet (die Kurve ist variationsreduzierend, bzw. hat eine beschränkte Schwankung).
  • Eine affine Transformation (Verschiebung, Skalierung, Rotation, Scherung) kann auf die Bézierkurve durch Transformation des Kontrollpolygons angewendet werden („affine Invarianz“).
  • Liegen alle Kontrollpunkte auf einer Geraden, so wird die Bézierkurve zu einer Strecke (Vorteil gegenüber der Polynominterpolation).
  • Der Einfluss eines Kontrollpunktes auf die Kurve ist global. Das heißt: Verschiebt man einen Punkt, verändert sich die gesamte Kurve. Daher verwendet man in der Praxis meist Splines, zusammengesetzte Kurven festen Grades, die stetig ineinander übergehen.
  • Eine Bézierkurve kann immer in zwei Bézierkurven gleicher Ordnung geteilt werden, wobei sich die neuen Kontrollpunkte aus den vorherigen Stützpunkten ergeben. Dabei ist der Trennungspunkt vom Parameter t abhängig. Aus der Abbildung für die Konstruktion einer Bézierkurve ist ersichtlich, dass sich die neue erste Kurve aus den Kontrollpunkten P_0, Q_0, R_0, B zusammensetzt, während die zweite Kurve aus den Punkten B, R_1, Q_2, P_3 besteht. Diese Eigenschaft kann genutzt werden um eine Kurve rekursiv mit Hilfe des De-Casteljau-Algorithmus durch Geraden anzunähern.

Als verallgemeinerte Form der Bézierkurve kann die Bézierfläche gesehen werden. Eine Bézierfläche (n,m)-ter Ordnung ist eine Fläche der Form

C(u, v) = \sum_{i=0}^n \sum_{j=0}^m P_{i,j} B_{i,n}(u) B_{j,m}(v)

mit den Kontrollpunkten P_{i, j} und den Bernsteinpolynomen B_{i,n}(u) und B_{j,m}(v).

Eine Bézierfläche kann also durch zwei zueinander orthogonale Bézierkurven beschrieben werden.

Bézierkurven bis zum dritten Grad[Bearbeiten]

Konstruktion einer linearen Bézierkurven

Lineare Bézierkurven (n=1)[Bearbeiten]

Zwei Kontrollpunkte P_0 und P_1 bestimmen eine gerade Strecke zwischen diesen beiden Punkten. Der Verlauf dieser linearen Bézier“kurve” wird angegeben durch

 C(t) = \sum_{i=0}^1 t^i (1-t)^{1-i} P_i  =\ (1-t)P_0 + t P_1 \mbox{ , } t \in [0,1]

Quadratische Bézierkurven (n=2)[Bearbeiten]

Konstruktion einer quadratischen Bézierkurven

Eine quadratische Bézierkurve ist der Pfad, der durch die Funktion C(t) für die Punkte P_0, P_1 und P_2 verfolgt wird:

\begin{align}
      C(t) \ & =\ \sum_{i=0}^2 \binom 2 i t^i (1-t)^{2-i} P_i \\
           \ & =\ (1 - t)^{2}P_0 + 2t(1 - t)P_1 + t^{2}P_2 \\
           \ & =\ (P_0 - 2P_1 + P_2)t^{2} + (-2P_0 + 2P_1)t + P_0 \mbox{ , } t \in [0,1]
\end{align}

Mit Hilfe des De-Casteljau-Algorithmus ausgedrückt: C(t)=C_{0}^{2}(t)

C_{0}^{2}(t)=(1-t)\underbrace{\Bigl[(1-t)\overbrace{P_{0}}^{C_{0}^{0}}+t\overbrace{P_{1}}^{C_{1}^{0}}\Bigr]}_{C_{0}^{1}(t)}+t\underbrace{\Bigl[(1-t)\overbrace{P_{1}}^{C_{1}^{0}}+t\overbrace{P_{2}}^{C_{2}^{0}}\Bigr]}_{C_{1}^{1}(t)}

Die Strecken C_{0}^{1}(t) und C_{1}^{1}(t) sind die Kanten des Kontrollpolygons (graue Linien in nebenstehender Animation). Die Kurvenschar \tilde{C}_{0}^{2}(\tilde{t},t)=(1-\tilde{t})C_{0}^{1}(t)+\tilde{t}C_{1}^{1}(t) mit \tilde{t}\in[0,1] entspricht den grünen Linien in der Animation. Die Auswertung an den Stellen mit \tilde{t}=t gibt den Verlauf der Bézierkurve an: C_{0}^{2}(t)=\tilde{C}_{0}^{2}(t,t).

Kubische Bézierkurven (n=3)[Bearbeiten]

Konstruktion einer kubischen Bézierkurven

Kubische Bézierkurven sind in der Praxis von großer Bedeutung, da sowohl B-Spline-Kurven, als auch NURBS stückweise in kubische Bézierkurven umgewandelt werden, um dann effizient mit dem De-Casteljau-Algorithmus gezeichnet zu werden. Selbiges gilt für hermitesche Splines, die in ihrer kubischen Form, vor allem in der Computeranimation zur Interpolation zwischen Keyframes verwendet werden.

Vier Punkte (P_0, P_1, P_2 und P_3) bestimmen eine kubische Bézierkurve. Die Kurve beginnt bei P_0 und geht in Richtung P_1 und dann aus Richtung P_2 zu P_3. Im Allgemeinen geht die Kurve nicht durch P_1 und P_2 – diese Punkte dienen nur der Richtung, wobei P_1 die Richtung bestimmt, in welche die Kurve in P_0 geht. P_2 legt die Richtung fest, aus welcher die Kurve zu P_3 geht. Der Abstand zwischen P_0 und P_1 und der Abstand von P_2 und P_3 bestimmen, „wie weit“ sich die Kurve in Richtung der Kontrollpunkte P_1 und P_2 bewegt, bevor sie in Richtung P_3 läuft.

\begin{align} 
   C(t) \ & = \ \sum_{i=0}^3 \binom 3 i t^i (1-t)^{3-i} P_i \\
          & = \ (1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3 \\
          & = \ (-P_0 + 3P_1 -3P_2 + P_3) t^3 + (3P_0 - 6P_1 + 3P_2) t^2 + (-3P_0 + 3P_1) t + P_0, t \in [0,1]
\end{align}

Mit Hilfe des De-Casteljau-Algorithmus ausgedrückt: C(t)=C_{0}^{3}(t)

\begin{align}
C_{0}^{3}(t)=(1-t) & \underbrace{\Bigl\{(1-t)\overbrace{\bigl[(1-t)P_{0}+tP_{1}\bigr]}^{C_{0}^{1}(t)}+t\overbrace{\bigl[(1-t)P_{1}+tP_{2}\bigr]}^{C_{1}^{1}(t)}\Bigr\}}_{C_{0}^{2}(t)}+\\
+t & \underbrace{\Bigl\{(1-t)\overbrace{\bigl[(1-t)P_{1}+tP_{2}\bigr]}^{C_{1}^{1}(t)}+t\overbrace{\bigl[(1-t)P_{2}+tP_{3}\bigr]}^{C_{2}^{1}(t)}\Bigr\}}_{C_{1}^{2}(t)}
\end{align}

Die Strecken C_{0}^{1}(t) und C_{1}^{1}(t) sowie C_{2}^{1}(t) sind die Kanten des Kontrollpolygons (graue Linien in nebenstehender Animation). Die beiden Kurvenscharen \tilde{C}_{0}^{2}(\tilde{t},t)=(1-\tilde{t})C_{0}^{1}(t)+\tilde{t}C_{1}^{1}(t) und \tilde{C}_{1}^{2}(\tilde{t},t)=(1-\tilde{t})C_{1}^{1}(t)+\tilde{t}C_{2}^{1}(t) mit \tilde{t}\in[0,1] entsprechen den grünen Linien in der Animation.

Die Kurvenschar \tilde{C}_{0}^{3}(\tilde{t},t)=(1-\tilde{t})C_{0}^{2}(t)+\tilde{t}C_{1}^{2}(t) mit \tilde{t}\in[0,1] entspricht den blauen Linien in der Animation. Die Auswertung an den Stellen mit \tilde{t}=t gibt den Verlauf der Bézierkurve an: C_{0}^{3}(t)=\tilde{C}_{0}^{3}(t,t).

Kubische Darstellung quadratischer Bézierkurven[Bearbeiten]

Wählt man die mittleren Bézierpunkte P_1 und P_2 einer kubischen Bézierkurve wie folgt

P_{1}:=P_{0}+\frac{2}{3}(P_{12}-P_{0}) \,,\  P_{2}:=P_{3}+\frac{2}{3}(P_{12}-P_{3})

erhält man eine Kurve, die exakt der quadratischen Bézierkurve mit den Punkten P_0, P_{12} und P_3 entspricht:

\begin{align}
C(t) & =(1-t)^{3}P_{0}+3t(1-t)^{2}\left(\frac{2}{3}P_{12}+\frac{1}{3}P_{0}\right)+3t^{2}(1-t)\left(\frac{2}{3}P_{12}+\frac{1}{3}P_{3}\right)+t^{3}P_{3}\\
 & =(1-t)^{2}P_{0}+2t(1-t)P_{12}+t^{2}P_{3}
\end{align}

Damit lassen sich auch dann quadratische Bézierkurven darstellen, falls ein Vektorzeichenprogramm (z. B. Inkscape) bzw. eine Grafikbibliothek (z. B. Cairo) nur kubische unterstützt.

Anwendung: Kreisapproximation durch kubische Bézierkurven[Bearbeiten]

Kreise bzw. Kreisbögen lassen sich durch Bézierkurven nicht exakt, sondern nur genähert darstellen. Eine solche Näherung ist z. B. für die Gestaltung einer Typ-1-PostScript-Schrift nötig, da hier nur Strecken und Bézierkurven dritten Grades erlaubt sind. (Jedoch verläuft auch für größere n keine Bézierkurve t\mapsto(x(t)|y(t)) n-ten Grades in einem noch so kleinen Kreisbogen mit Radius r zum Mittelpunkt (z_1|z_2), denn (x(t_0)|y(t_0)) liegt genau dann auf dem Kreisbogen, wenn t_0 Nullstelle der Polynomfunktion t \mapsto [x(t)-z_1]^2+[y(t)-z_2]^2-r^2 vom Grad 2n ist, was höchstens 2n Male vorkommt – vgl. Fehleranalyse.)

Teilt man einen Kreis in nur zwei (gleich große) Segmente und nähert die Halbkreise durch kubische Bézierkurven, zeigen sich größere Abweichung von der Kreisgestalt. Durch eine feinere Unterteilung in mehr Segmente lässt sich ein Kreis besser nähern. Je geringer der überstrichene Winkelbereich des Kreissegments ist, desto genauer ist die Näherung durch die Bézierkurve. Eine oft verwendete, einfache Realisierung eines Kreises verwendet vier Viertelkreisbögen, die als kubische Bézierkurven dargestellt werden. Um die Verbesserung der Näherung durch Verfeinerung der Unterteilung zu demonstrieren, werden in der Folge die Fehler der Halbkreisapproximation und der Viertelkreisapproximation miteinander verglichen.

Notation: Wir untersuchen Approximationen eines Kreises Q mit folgenden Parametern:

Die zusätzlichen Kontrollpunkte P_1 und P_2 werden so gewählt, dass P_1 zu P_0 und P_2 zu P_3 den Abstand \kappa r hat.

Beispielkoordinaten Viertelkreis[Bearbeiten]

Als einfaches Beispiel einer Viertelkreisapproximation wählen wir:

  • den Mittelpunkt M des Kreises Q als (0|0),
  • den Kontrollpunkt P_0 auf der Kreislinie als (r|0),
  • den Kontrollpunkt P_3 auf der Kreislinie als (0|r) – die Strecke MP_3 steht also senkrecht auf MP_0, so dass beide Strecken einen Viertelkreissektor bilden –,
  • den Kontrollpunkt P_1 als P_0+\kappa(P_3-M) = (r|r\kappa) (auf der Strecke P_0(r|r)),
  • den Kontrollpunkt P_2 als P_3+\kappa(P_0-M) = (r\kappa|r) (auf der Strecke P_3(r|r)).

Die vier Kontrollpunkte liegen also auf dem Rand des Quadrats mit den Eckpunkten M=(0|0), P_0=(r|0), P_3=(0|r) und (r|r). Dies gewährleistet immerhin, dass die Näherungskurve und die Kreislinie in P_0 und P_3 dieselbe Tangente haben. So ist auch die aus den Viertelkreisapproximationen zusammengesetzte Kurve in den Knotenpunkten „glatt“.

Die kubische Bézierkurve t\mapsto(x_\kappa(t)|y_\kappa(t)) (t\in[0;1]) hat mit diesen Kontrollpunkten folgende Form:

x_\kappa(t)=(1-t)^{3}r+3t(1-t)^{2}r+3t^{2}(1-t)\kappa r \,,\quad y_\kappa(t)=t^{3}r+3t^{2}(1-t)r+3t(1-t)^{2}\kappa r

Eine recht gute Approximation des oberen rechten Viertelkreisbogens erhält man mit \kappa=0{,}552, wie die nachfolgende Betrachtung zeigt.

Fehleranalyse[Bearbeiten]

Die Abweichung der gerade angegebenen Bézierkurve t \mapsto (x_\kappa(t)|y_\kappa(t)) vom darzustellenden Kreis Q lässt sich folgendermaßen quantifizieren:

Ein Punkt (x_\kappa(t_0)|y_\kappa(t_0)) der Bézierkurve (x_\kappa|y_\kappa) liegt genau dann auf der vorgegebenen Kreislinie mit Radius r um den Mittelpunkt M=(0|0), wenn x_\kappa(t_0)^2 + y_\kappa(t_0)^2=r^2 („Koordinatengleichung“) gilt. Definiert man

f_\kappa(t)=\frac{x_\kappa(t)^2+y_\kappa(t)^2-r^2}{r^2};\quad0\leq t\leq 1,

so ist das äquivalent zu f_\kappa(t_0)=0. f_\kappa(t) ist ein Maß für die Abweichung der Approximation (x_\kappa|y_\kappa) von der Kreisgestalt.

Fordert man dann die Übereinstimmung der Bézierkurve (x_\kappa|y_\kappa) mit dem Kreis Q bei der Winkelhalbierenden, erhält man

0=f_\kappa(0{,}5)=\frac{9\kappa^{2}+24\kappa-16}{32}\quad\Longrightarrow\quad\kappa=\frac{4}{3}(\sqrt{2}-1)\approx0{,}55228

Der Fehler ist Null bei t\in\left\lbrace0; 0{,}5; 1\right\rbrace, sonst überall positiv, d. h. die Bézierkurve liegt stets auf oder außerhalb des Kreisbogens. Der maximale Fehler beträgt f_\kappa(t)=5{,}45\cdot 10^{-4} bei t=0{,}211 und bei t=0{,}789.

Fordert man, dass die aufsummierten Fehler über die gesamte Kurve verschwinden (f_\kappa(t) kann sowohl positiv als auch negativ sein – die Bézierkurve verläuft teils außerhalb, teils innerhalb der Kreislinie – und das Integral darüber kann Null ergeben), erhält man

0=\int_{0}^{1}f_\kappa(t)\,\mathrm{d}t=\frac{6\kappa^{2}+13\kappa-9}{35}\quad\Longrightarrow\quad\kappa=\frac{\sqrt{385}-13}{12}\approx0{,}55178

Die größten Abweichungen liegen bei etwa f_\kappa(0{,}5)=-5{,}3\cdot 10^{-4} und bei f_\kappa(0{,}173)=f_\kappa(0{,}827)=3{,}5\cdot 10^{-4}. Beide Approximationen sind somit für viele Anwendungsbereiche ausreichend.

Beispielkoordinaten Halbkreis[Bearbeiten]

Bei einer Halbkreisnäherung mit M=(0|0), P_0=(0|-r), P_3=(0|r), und P_1=(\kappa r|-r), P_2=(\kappa r|r) mit \kappa=1{,}3156 beträgt die maximale Abweichung f_\kappa(t)=2{,}65\%. Dies ist bzgl. der maximalen Abweichung etwa 50 mal schlechter als die Viertelkreisapproximation.

Gebrochenrationale Bézierkurve[Bearbeiten]

Gebrochenrationale Bezierkurve dritten Grades mit unterschiedlicher Gewichtung der Kontrollpunkte

Gebrochenrationale Bézierkurven können vereinfacht als Bézierkurven betrachtet werden, deren Kontrollpunkte mit Gewichten/Anziehungskraft versehen sind und die damit den Kurvenverlauf in ihre Richtung hin beeinflussen.

Die Bezeichnung als gebrochenrationale Bézierkurven ergibt sich wohl aus der häufig gewählten Formeldarstellung

C(t) \ = \ \frac{\sum_{i=0}^n w_i B_{i,n}(t) P_i}{\sum_{i=0}^n w_i B_{i,n}(t)}.

Die Darstellung als Quotient, sowie die zu einfache Vorstellung der Funktion der Gewichte, können aber leicht zu einem falschen Verständnis der Zusammenhänge führen.

Genese[Bearbeiten]

Die Multiplikation der Kontrollpunkte (Ortsvektoren) mit ihren zugehörigen Gewichten, wie sie in obiger Formeldarstellung erkennbar ist, entspricht nicht einer einfachen Skalierung der Ortsvektoren, sondern einer Koordinatentransformation in den projektiven Raum – Ergebnis der Multiplikation ist also der Ortsvektor, der in homogenen Koordinaten dargestellt ist. Nach der Transformation in den projektiven Raum wird die Kurve nach dem normalen Bildungsgesetz erzeugt und anschließend wieder in den Ursprungsraum zurück transformiert, was praktisch durch das Teilen erfolgt.

Projektiver Raum und homogene Koordinaten[Bearbeiten]

Die Projektion der Kontrollpunkte in den projektiven Raum mittels ihrer Gewichte verändert im Allgemeinen (also wenn nicht alle Gewichte gleich 1 sind) die Lage der Kontrollpunkte zueinander, verzerrt also das Kontrollpolygon. Diese Verzerrung wirkt sich nun so aus, dass die Kurve sich in der zurücktransformierten Darstellung den Punkten mit höherer Gewichtung stärker nähert.

Weblinks[Bearbeiten]

Vier Stützpunkte[Bearbeiten]

Mehr als vier Stützpunkte[Bearbeiten]

Literatur[Bearbeiten]

  • Gerald Farin: Curves and Surfaces for CAGD. A practical guide. 5. Aufl. Academic Press, San Diego 2002, ISBN 1-55860-737-4
  • David Salomon: Curves and Surfaces for Computer Graphics. Springer Science+Business Media, Inc., 2006, ISBN 0-387-24196-5
  • Boaswan Dzung Wong: Bézierkurven: gezeichnet und gerechnet. Orell Füssli Verlag, Zürich 2003, ISBN 3-280-04021-3
  • Wolfgang Boehm, Gerald Farin, Jürgen Kahmann: A survey of curve and surface methods in CAGD, Comput. Aided Geom. Des. 1, S. 1-60, 1984