Bézierkurve

Bézier-Kurve 3. Grades und ihr Kontrollpolygon
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) hinzugefügt. Man erkennt, wie die Kurve bei Einfügen/Verändern eines Kontrollpunkts ihre Richtung und/oder Krümmung variiert.

Die Bézierkurve [be'zje…] ist eine parametrisch modellierte Kurve, die ein wichtiges Werkzeug bei der Beschreibung von Freiformkurven und -flächen darstellt.

In der Computergrafik finden Bézierkurven wegen ihrer optischen Eleganz und der verhältnismäßig leichten mathematischen Handhabbarkeit häufig Anwendung. Sie werden zur Definition von Kurven und Flächen in Vektorgrafiken genutzt. Mögliche Anwendungsfälle finden sich z.B. im Computer Aided Design, bei der Erstellung von Illustrationen oder der Beschreibung von Schrifttypen (z.B. Postscript, Type1, TrueType und CFF-OpenType).

Die Bézierkurve 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.

Verallgemeinerungen des Konzepts der Bézierkurven führen zu den Bézierflächen.

Motivation, Definition

Numerisch einfache Kurven in der Ebene sind solche, die mit Hilfe einer Parameterdarstellung {\displaystyle {\bf {x}}(t)=(x(t),y(t))^{T},\;t_{1}\leq t\leq t_{2},} beschrieben werden, wobei {\displaystyle x(t)} und {\displaystyle y(t)} Polynome in t sind. Ist

{\displaystyle x(t)=a_{0}+a_{1}t+a_{2}t^{2}+\cdots +a_{n}t^{n}},
{\displaystyle y(t)=b_{0}+b_{1}t+b_{2}t^{2}+\cdots +b_{n}t^{n}}

und setzt man {\displaystyle {\bf {a}}_{i}=(a_{i},b_{i})^{T}}, so lässt sich die Kurve übersichtlicher durch

{\displaystyle {\bf {x}}(t)={\bf {a}}_{0}+{\bf {a}}_{1}t+{\bf {a}}_{2}t^{2}+\cdots +{\bf {a}}_{n}t^{n}\ } beschreiben.

Im Allgemeinen sagen die Koeffizienten-Punkte {\displaystyle {\bf {a}}_{i}} nicht viel über den Kurvenverlauf aus. Nur {\displaystyle {\bf {a}}_{0}} (Punkt der Kurve) und {\displaystyle {\bf {a}}_{1}} (Tangentenvektor) haben konkrete geometrische Bedeutungen. Dies ändert sich, wenn man die Polynome {\displaystyle x(t),y(t)} nicht in der Monom-Basis {\displaystyle \{1,t,t^{2},\dotsc ,t^{n}\}}, sondern in der folgenden Bernsteinbasis {\displaystyle \{B_{0}^{n}(t),B_{1}^{n}(t),\dotsc ,B_{n}^{n}(t)\}} darstellt:

Es sei nun n>0 festgewählt und die Vektoren {\displaystyle {\bf {b}}_{0},{\bf {b}}_{1},\dotsc ,{\bf {b}}_{n}} beschreiben ein ebenes oder räumliches Polygon. Dann heißt

eine Bezierkurve vom (maximalen) Grad n. Die Punkte {\displaystyle {\bf {b}}_{0},\dotsc ,{\bf {b}}_{n}} nennt man Kontrollpunkte der Bezierkurve.

Eigenschaften der Bernsteinpolynome:

Bernsteinpolynome
  1. {\displaystyle B_{0}^{n}(t)+B_{1}^{n}(t)+\cdots +B_{n}^{n}(t)=1,}
  2. {\displaystyle B_{0}^{n}(0)=1,\;B_{i}^{n}(0)=0} für {\displaystyle i>0,\quad B_{n}^{n}(1)=1,\;B_{i}^{n}(1)=0} für {\displaystyle i<n.}
  3. Das Bernsteinpolynom {\displaystyle B_{i}^{n}} hat genau ein Maximum und zwar an der Stelle {\displaystyle t=i/n.} D.h. eine leichte Veränderung des Punktes {\displaystyle {\bf {b}}_{i}} hat nur eine wesentliche Veränderung der Kurve in der Umgebung von {\displaystyle {\bf {x}}(i/n)} zur Folge.

Eigenschaften einer Bézierkurve:

  1. {\displaystyle {\bf {b}}_{0}} ist der Anfangs-, {\displaystyle {\bf {b}}_{n}} der Endpunkt
  2. {\displaystyle {\bf {b}}_{1}-{\bf {b}}_{0}} ist die Richtung der Tangente im Punkt {\displaystyle {\bf {b}}_{0}={\bf {x}}(0),\;{\bf {b}}_{n-1}-{\bf {b}}_{n}} ist die Richtung der Tangente im Punkt {\displaystyle {\bf {b}}_{n}={\bf {x}}(1).}
  3. Das Polygon {\displaystyle {\bf {b}}_{0},{\bf {b}}_{1},\dotsc ,{\bf {b}}_{n}} gibt einen ungefähren Verlauf der Kurve an.

Weitere Eigenschaften der Bernsteinbasis

Für Untersuchungen von Bezierkurven sind die folgenden Eigenschaften nützlich:

Beziehung zwischen der Bernstein- und der Monom-Basis
 
(MB){\displaystyle \qquad t^{i}=\sum _{j=i}^{n}{\frac {j \choose i}{n \choose i}}B_{j}^{n}(t),\qquad B_{i}^{n}(t)=\sum _{j=i}^{n}(-1)^{j-i}{n \choose j}{j \choose i}t^{j},}
Rekursion
 
(R) {\displaystyle \qquad B_{i}^{n}(t)=(1-t)B_{i}^{n-1}(t)+tB_{i-1}^{n-1}(t),}
Skalierung
 
(S) {\displaystyle \qquad B_{i}^{n}(ct)=\sum _{j=0}^{n}B_{i}^{j}(c)B_{j}^{n}(t),}
Ableitung
 
(A) {\displaystyle \qquad {\frac {d}{dt}}B_{i}^{n}(t)=n\left(B_{i-1}^{n-1}(t)-B_{i}^{n-1}(t)\right),}
(Man beachte, dass {\displaystyle B_{-1}^{\cdots }(t)=0,B_{n}^{n-1}(t)=0} ist.)
Produkt
 
(P) {\displaystyle \qquad B_{i}^{m}(t)B_{j}^{n}(t)={\frac {{m \choose i}{n \choose j}}{m+n \choose i+j}}B_{i+j}^{m+n}(t).}

Weitere Eigenschaften einer Bézierkurve

In der Literatur werden noch weitere Eigenschaften einer Bézierkurve aufgelistet:

{\displaystyle 1=\sum _{i=0}^{n}B_{i}^{n}(t)\quad t\in [0,1]}
{\displaystyle {\bf {b}}(t)={\bf {b}}_{0}+n({\bf {b}}_{1}-{\bf {b}}_{0})t+{\frac {n(n-1)}{2}}({\bf {b}}_{0}-2{\bf {b}}_{1}+{\bf {b}}_{2})t^{2}+{\mathcal {O}}(t^{3})}
{\displaystyle {\bf {b}}(t)={\bf {b}}_{n}+n({\bf {b}}_{n-1}-{\bf {b}}_{n})(1-t)+{\frac {n(n-1)}{2}}({\bf {b}}_{n-2}-2{\bf {b}}_{n-1}+{\bf {b}}_{n})(1-t)^{2}+{\mathcal {O}}((1-t)^{3})}

Der De-Casteljau-Algorithmus

Hauptartikel: De-Casteljau-Algorithmus

Höhere Potenzen von t auszurechnen ist numerisch instabil. Der folgende Algorithmus führt deshalb die Berechnung eines Kurvenpunktes auf wiederholte lineare Interpolation zurück. In jedem Schritt wird mittels linearer Interpolation ein neues um 1 kürzeres Polygon berechnet (s. Bild). Bei der letzten Interpolation entsteht schließlich der Kurvenpunkt:

De-Casteljau-Algorithmus für eine Bezier-Kurve 3. Grades

Für das Polygon {\displaystyle \;{\bf {b}}_{0},{\bf {b}}_{1},\dots ,{\bf {b}}_{n}\;} im \mathbb {R} ^{2} (oder \mathbb {R} ^{3}) und einem t \in \R definiert man rekursiv für jedes {\displaystyle r=1,\dots ,n} das Polygon

Das Polygon der Stufe r=0 ist identisch mit dem Ausgangspolygon, das Polygon der Stufe r=n ist ein Punkt, der Kurvenpunkt.

Aus der Rekursionseigenschaft (R) der Bernsteinpolynome folgt

{\displaystyle {\bf {b}}_{i}^{r}(t)=\sum _{j=0}^{r}{\bf {b}}_{i+j}B_{j}^{r}(t),\ }
für {\displaystyle r=0,\dots ,n,\ i=0,\dots ,n-r\ .}

(Beweis mit Hilfe vollständiger Induktion über r.) Also ist

die Bezierkurve mit dem Kontrollpolygon {\displaystyle {\bf {b}}_{0},{\bf {b}}_{1},\dots ,{\bf {b}}_{n}}. Diese Methode, einen Punkt der Bezierkurve durch lineare Interpolationen zu bestimmen, heißt De-Casteljau-Algorithmus.

Wie für ein {\displaystyle t\in \mathbb {R} } mit Hilfe des Casteljau-Algorithmus aus dem Kontrollpolygon die Zwischenpolygone und schließlich der Punkt der Bezierkurve entsteht, zeigt die Abbildung für n=3. Die neuen Punkte teilen immer die alten Strecken, auf denen sie liegen, im gleichen Verhältnis {\displaystyle (1-t):t}.

Bézierkurven bis zum dritten Grad

lineare Bézierkurve

Lineare Bézierkurven (n=1):

Zwei Kontrollpunkte {\displaystyle P_{0}:{\bf {b}}_{0}} und {\displaystyle P_{1}:{\bf {b}}_{1}} bestimmen eine gerade Strecke zwischen diesen beiden Punkten. Der Verlauf dieser linearen Bézier„kurve“ wird beschrieben durch

{\displaystyle {\bf {b}}(t)=\ (1-t){\bf {b_{0}}}+t{\bf {b}}_{1}{\mbox{ , }}\ t\in [0,1]}

Quadratische Bézierkurven (n=2):

quadratische Bézierkurve mit Casteljau-Algorithmus

Eine quadratische Bézierkurve ist der Pfad, der durch die Funktion {\displaystyle {\bf {b}}(t)} für die Punkte {\displaystyle P_{0}:{\bf {b}}_{0}}, {\displaystyle P_{1}:{\bf {b}}_{1}} und {\displaystyle P_{2}:{\bf {b}}_{2}} beschrieben wird:

{\displaystyle {\begin{aligned}{\bf {b}}(t)\ &=\ \sum _{i=0}^{2}{\binom {2}{i}}t^{i}(1-t)^{2-i}{\bf {b}}_{i}\\\ &=\ (1-t)^{2}{\bf {b}}_{0}+2t(1-t){\bf {b}}_{1}+t^{2}{\bf {b}}_{2}\\\ &=\ ({\bf {b}}_{0}-2{\bf {b}}_{1}+{\bf {b}}_{2})t^{2}+(-2{\bf {b}}_{0}+2{\bf {b}}_{1})t+{\bf {b}}_{0}{\mbox{ , }}\ t\in [0,1]\ .\end{aligned}}}

Die letzte Zeile zeigt: Eine quadratische Bézierkurve ist eine Parabel.

Mit Hilfe des De-Casteljau-Algorithmus ausgedrückt: {\displaystyle {\bf {b}}(t)={\bf {b}}_{0}^{2}(t)}

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


Kubische Bézierkurven (n=3):

kubische Bézierkurve mit Casteljau-Algorithmus

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.

{\displaystyle {\begin{aligned}{\bf {b}}(t)\ &=\ \sum _{i=0}^{3}{\binom {3}{i}}t^{i}(1-t)^{3-i}{\bf {b}}_{i}\\&=\ (1-t)^{3}{\bf {b}}_{0}+3t(1-t)^{2}{\bf {b}}_{1}+3t^{2}(1-t){\bf {b}}_{2}+t^{3}{\bf {b}}_{3}\\&=\ (-{\bf {b}}_{0}+3{\bf {b}}_{1}-3{\bf {b}}_{2}+{\bf {b}}_{3})t^{3}+(3{\bf {b}}_{0}-6{\bf {b}}_{1}+3{\bf {b}}_{2})t^{2}+(-3{\bf {b}}_{0}+3{\bf {b}}_{1})t+{\bf {b}}_{0}\ ,\ t\in [0,1]\ .\end{aligned}}}

Mit Hilfe des De-Casteljau-Algorithmus ausgedrückt: {\displaystyle {\bf {b}}(t)={\bf {b}}_{0}^{3}(t)}

{\displaystyle {\begin{aligned}{\bf {b}}_{0}^{3}(t)=(1-t)&\underbrace {{\Bigl \{}(1-t)\overbrace {{\bigl [}(1-t){\bf {b}}_{0}+t{\bf {b}}_{1}{\bigr ]}} ^{{\bf {b}}_{0}^{1}(t)}+t\overbrace {{\bigl [}(1-t){\bf {b}}_{1}+t{\bf {b}}_{2}{\bigr ]}} ^{{\bf {b}}_{1}^{1}(t)}{\Bigr \}}} _{{\bf {b}}_{0}^{2}(t)}+\\t&\underbrace {{\Bigl \{}(1-t)\overbrace {{\bigl [}(1-t){\bf {b}}_{1}+t{\bf {b}}_{2}{\bigr ]}} ^{{\bf {b}}_{1}^{1}(t)}+t\overbrace {{\bigl [}(1-t){\bf {b}}_{2}+t{\bf {b}}_{3}{\bigr ]}} ^{{\bf {b}}_{2}^{1}(t)}{\Bigr \}}} _{{\bf {b}}_{1}^{2}(t)}\end{aligned}}}

Vergleich der Kurvendarstellungen

Vergleich zwischen Kurvendarstellungen

Polynomiale Kurven (d.h. die Koordinaten sind Polynome bzgl. t) lassen sich in der Monom-Basis, der Bernsteinbasis und mit Hilfe des De-Casteljau-Algorithmus (fortgesetzte lineare Interpolation) beschreiben. Da die Koeffizientenpunkte der Monom-Basis nicht viel über den Kurvenverlauf aussagen, entstanden die Darstellungen mit der Bernstein-Basis (Bezier-Kurven) und mit dem De-Casteljau-Algorithmus. Die letzten beiden haben allerdings auch Vor- und Nachteile. Der De-Casteljau-Algorithmus hat gegenüber der Bezierdarstellung bei der Berechnung der Punkte (Numerik) Vorteile. Bezierkurven lassen sich dafür durch die vielen formalen Eigenschaften (s.o.) der Bernstein-Polynome leichter theoretisch (z.B. Krümmung) untersuchen. Der numerische Nachteil der Bezier-Kurven (Auswertung der Bernstein-Polynome) lässt sich durch eine dem Horner-Schema ähnlichen Methode ausgleichen:

function bezier_comp(degree: integer; coeff : r_array; t: real) : real;
{Berechnet eine Komponente einer Bezier-Kurve. (Aus FARIN: Curves and Surfaces...)}
var i,n_choose_i : integer;    fact,t1,aux : real;
begin
  t1:= 1-t;  fact:=1;  n_choose_i:= 1;
  aux:= coeff[0]*t1;
  for i:= 1 to degree-1 do
      begin
      fact:= fact*t;
      n_choose_i:= n_choose_i*(degree-i+1) div i;
      aux:= (aux + fact*n_choose_i*coeff[i])*t1;
      end;
  aux:= aux + fact*t*coeff[degree] ;
  bezier_comp:= aux;
end;   {bezier_comp}

Ableitungen einer Bézier-Kurve

Mit Hilfe der Ableitungen der Bernsteinpolynome ergibt sich für die 1. Ableitung der Bézierkurve {\displaystyle \ {\bf {b}}(t)=\sum _{i=0}^{n}B_{i}^{n}(t){\bf {b}}_{i}\ }:

{\displaystyle {\frac {d}{dt}}{\bf {b}}(t)=n\sum _{i=0}^{n-1}B_{i}^{n-1}(t)({\bf {b}}_{i+1}-{\bf {b}}_{i})\ .}

Lässt man die Tangentenvektoren alle im Nullpunkt des Koordinatensystems beginnen, so beschreiben sie eine weitere Bézierkurve mit den Kontrollpunkten {\displaystyle \ \Delta {\bf {b}}_{i}:={\bf {b}}_{i+1}-{\bf {b}}_{i}\ }.

Speziell gilt:

{\displaystyle {\frac {d}{dt}}{\bf {b}}(0)=n({\bf {b}}_{1}-{\bf {b}}_{0})\quad } und {\displaystyle \quad {\frac {d}{dt}}{\bf {b}}(1)=n({\bf {b}}_{n}-{\bf {b}}_{n-1}).}

Um höhere Ableitungen übersichtlich schreiben zu können, führt man folgenden Differenzenoperator ein:

{\displaystyle \Delta ^{r}{\bf {b}}_{i}:=\Delta ^{r-1}{\bf {b}}_{i+1}-\Delta ^{r-1}{\bf {b}}_{i},}

Es ist

{\displaystyle {\begin{array}{rcl}\Delta ^{0}{\bf {b}}_{i}&=&{\bf {b}}_{i}\\\Delta ^{1}{\bf {b}}_{i}&=&{\bf {b}}_{i+1}-{\bf {b}}_{i}\\\Delta ^{2}{\bf {b}}_{i}&=&{\bf {b}}_{i+2}-2{\bf {b}}_{i+1}+{\bf {b}}_{i}\\\Delta ^{3}{\bf {b}}_{i}&=&{\bf {b}}_{i+3}-3{\bf {b}}_{i+2}+3{\bf {b}}_{i+1}-{\bf {b}}_{i}\\&\vdots \\\Delta ^{r}{\bf {b}}_{i}&=&\sum _{j=0}^{r}{r \choose j}(-1)^{r-j}{\bf {b}}_{i+j}\end{array}}}

Die r-te Ableitung der Bézierkurve {\displaystyle \ {\bf {b}}(t)=\sum _{i=0}^{n}{\bf {b}}_{i}B_{i}^{n}(t)\ } lässt sich jetzt wie folgt schreiben:

{\displaystyle {\frac {d^{r}}{dt^{r}}}{\bf {b}}(t)={\frac {n!}{(n-r)!}}\cdot \sum _{i=0}^{n-r}\Delta ^{r}{\bf {b}}_{i}B_{i}^{n-r}(t)}

Speziell für t=0 und t=1 erhält man

{\displaystyle {\frac {d^{r}}{dt^{r}}}{\bf {b}}(0)={\frac {n!}{(n-r)!}}\Delta ^{r}{\bf {b}}_{0}\quad } und {\displaystyle \quad {\frac {d^{r}}{dt^{r}}}{\bf {b}}(1)={\frac {n!}{(n-r)!}}\Delta ^{r}{\bf {b}}_{n-r}}

Graderhöhung einer Bézierkurve

Eine wichtige Manipulation der Darstellung einer vorgegebenen Bézierkurve ist die sog. Graderhöhung. Sie ist vergleichbar mit dem Anfügen von Termen {\displaystyle 0t^{n+1},0t^{n+2},\dots } an ein Polynom {\displaystyle \ a_{0}+a_{1}t+\cdots a_{n}t^{n}\ }. Dabei ändert sich das Polynom nicht und der (scheinbare) Grad wird erhöht. Analog stellt man eine fest vorgegebene Bézierkurve {\displaystyle \ {\bf {b}}(t)=\sum _{i=0}^{n}{\bf {b}}_{i}B_{i}^{n}(t)\ } in der Form {\displaystyle \ {\bf {b}}(t)=\sum _{i=0}^{n+1}{\bf {b}}_{i}^{(1)}B_{i}^{n+1}(t)\ } mit geeigneten neuen Kontrollpunkten {\displaystyle \ {\bf {b}}_{0}^{(1)},\dots ,{\bf {b}}_{n+1}^{(1)}\ } dar. Um die neuen Kontrollpunkte zu bestimmen, multipliziert man die ursprüngliche Darstellung mit dem Faktor {\displaystyle \ t+(1-t)\ }:

{\displaystyle {\begin{array}{rcl}{\bf {b}}(t)&=&\sum _{i=0}^{n}B_{i}^{n}(t)(t+(1-t)){\bf {b}}_{i}\\&=&\sum _{i=0}^{n}{n \choose i}t^{i}(1-t)^{n-i}(t+(1-t)){\bf {b}}_{i}\\&=&\sum _{i=0}^{n}{n \choose i}t^{i+1}(1-t)^{n-i}{\bf {b}}_{i}+\sum _{i=0}^{n}{n \choose i}t^{i}(1-t)^{n-i+1}{\bf {b}}_{i}\\&=&\sum _{i=1}^{n+1}{n \choose i-1}t^{i}(1-t)^{n+1-i}{\bf {b}}_{i-1}+\sum _{i=0}^{n}{n \choose i}t^{i}(1-t)^{n-i+1}{\bf {b}}_{i}\\&=&\sum _{i=0}^{n+1}t^{i}(1-t)^{n+1-i}\cdot \left({n \choose i-1}{\bf {b}}_{i-1}+{n \choose i}{\bf {b}}_{i}\right)\\&=&\sum _{i=0}^{n+1}{n+1 \choose i}t^{i}(1-t)^{n+1-i}{\bf {b}}_{i}^{(1)}\\&=&\sum _{i=0}^{n+1}B_{i}^{n+1}(t){\bf {b}}_{i}^{(1)},\quad {\text{wobei}}\\{\bf {b}}_{i}^{(1)}&:=&{\frac {i}{n+1}}{\bf {b}}_{i-1}+\left(1-{\frac {i}{n+1}}\right){\bf {b}}_{i},\ i=0,\dots ,n+1\\&=&\left({\frac {i}{n+1}}\right){\bf {b}}_{i}^{1}\quad {\text{für }}1\leq i\leq n{\text{ (s. Casteljau-Algor.)}}\end{array}}}

Die neuen Kontrollpunkte sind also:

{\displaystyle {\bf {b}}_{0},\quad \left({\frac {1}{n+1}}\right){\bf {b}}_{1}^{1},\quad \left({\frac {2}{n+1}}\right){\bf {b}}_{2}^{1}\quad ,\ldots ,\quad \left({\frac {n}{n+1}}\right){\bf {b}}_{n}^{1},\quad {\bf {b}}_{n}.}
Graderhöhungen einer Bezier-Kurve:
Kontrollpolygone bei ein-, zwei- und 10-maliger Graderhöhung}
 

Wesentliche Eigenschaften der Graderhöhung sind:

  1. Wiederholte Graderhöhung führt zu einer Approximation der Bézierkurve durch das Kontrollpolygon.
  2. Die größere Anzahl von Kontrollpunkten bietet mehr Freiheitsgrade, die Kurve zu verändern.
  3. Mehrere Bézierkurven lassen sich auf einen einheitlichen Grad bringen. Dies ist wichtig bei Tensorprodukt-Bézierflächen.
  4. Damit lassen sich auch dann quadratische Bézierkurven als kubische darstellen, falls ein Vektorzeichenprogramm (z.B. Inkscape) bzw. eine Grafikbibliothek (z.B. Cairo) nur kubische unterstützt.

Teilung einer Bézierkurve

Zerlegung einer Bezierkurve

Eine Bezierkurve {\displaystyle \Gamma _{0}:{\bf {b}}(t)} ist normalerweise definiert für {\displaystyle 0\leq t\leq 1}. Sei nun {\displaystyle c\in (0,1)}. Dann ist {\displaystyle \Gamma _{1}:{\bf {b}}(t)} mit {\displaystyle 0\leq t\leq c} ein Teil der gegebenen Bézierkurve. Es soll nun die Teilkurve \Gamma_1 als Bézierkurve {\displaystyle {\bf {c}}(u)=\sum _{i=0}^{n}{\bf {c}}_{i}B_{i}^{n}(u)} mit {\displaystyle u\in [0,1]} vom (selben) Grad n mit geeigneten Kontrollpunkten {\displaystyle {\bf {c}}_{0},{\bf {c}}_{1},\dots ,{\bf {c}}_{n}} dargestellt werden. Setzt man {\displaystyle u:={\frac {t}{c}}}, so muss die folgende Gleichung erfüllt sein:

{\displaystyle \sum _{r=0}^{n}{\bf {c}}_{r}B_{r}^{n}\left({\frac {t}{c}}\right)=\sum _{i=0}^{n}{\bf {b}}_{i}B_{i}^{n}(t),\quad } für {\displaystyle \quad t\in [0,c]}

Dies gilt für

Denn

{\displaystyle \sum _{r=0}^{n}{\bf {c}}_{r}B_{r}^{n}\left({\frac {t}{c}}\right)=\sum _{r=0}^{n}\sum _{i=0}^{r}{\bf {b}}_{i}B_{i}^{r}(c)B_{r}^{n}\left({\frac {t}{c}}\right)}
{\displaystyle =\sum _{r=0}^{n}\sum _{i=0}^{n}{\bf {b}}_{i}B_{i}^{r}(c)B_{r}^{n}\left({\frac {t}{c}}\right)\quad } wegen {\displaystyle \quad B_{i}^{r}(\cdots )=0\quad {\text{für}}\quad i>r}
{\displaystyle =\sum _{i=0}^{n}{\bf {b}}_{i}\sum _{r=0}^{n}B_{i}^{r}(c)B_{r}^{n}\left({\frac {t}{c}}\right)}
{\displaystyle =\sum _{i=0}^{n}{\bf {b}}_{i}B_{i}^{n}(t)\quad } (s. Eigensch. (S) der Bernst.-Pol.)

Der restliche Bogen ist die Bézierkurve {\displaystyle \Gamma _{2}:{\bf {d}}(v)} mit den Kontrollpunkten

Rationale Bezierkurven

Rationale Kurven und projektive Kurven

Bézierkurven sind parametrisierte Kurven, deren Parameterdarstellungen nur Polynome verwenden. Leider lassen sich so wichtige und geometrisch einfache Kurven wie Kreise nicht durch polynomiale Parameterdarstellungen beschreiben. Dieser Nachteil ist u.a. das Motiv für die Erweiterung der als Parameterfunktionen zulässigen Funktionen auf rationale Funktionen. Denn jeder Kegelschnitt hat eine rationale Darstellung. Da eine Kurve mit einer rationalen Darstellung

{\displaystyle \left({\frac {p_{1}(t)}{q_{1}(t)}},{\frac {p_{2}(t)}{q_{2}(t)}}\right)^{T}}

wobei die Funktionen p_{i} und q_{i} Polynome sind, in homogenen Koordinaten die polynomiale Darstellung

{\displaystyle <\left(p_{1}(t)q_{2}(t)\;,\;p_{2}(t)q_{1}(t)\;,\;q_{1}(t)q_{2}(t)\right)^{T}>}

besitzt, lassen sich ebene Kurven mit rationalen Koeffizientenfunktionen als Zentralprojektion einer Bézierkurve im \mathbb {R} ^{3} auf die Einbettungsebene x_{3}=1 auffassen.

Die analoge Aussage gilt für Kurven im \mathbb {R} ^{3}. Sie lassen sich als Zentralprojektion einer Bézierkurve im \mathbb {R} ^{4} auf den Einbettungsraum x_{4}=1 auffassen. Damit lassen sich die Vorteile der Bézier-Darstellung einer polynomialen Kurve auch für rationale Kurven nutzen.

Rationale Bezierkurve (rot) als Projektion einer gewöhnlichen räumlichen Bezierkurve (blau). Die Kontrollpunkte {\displaystyle {\bf {a}}_{i}} sind alle eigentlich, da keiner der Kontrollpunkte {\displaystyle {\bf {b}}_{i}} in der x_{1}-x_{2}-Ebene liegt.

Ebene rationale Bézierkurven

Es sei nun n>0 festgewählt und die Vektoren {\displaystyle {\bf {b}}_{0},{\bf {b}}_{1},\cdots ,{\bf {b}}_{n},\ {\bf {b}}_{i}\neq {\bf {0}},} beschreiben ein Polygon im \mathbb {R} ^{3}. Dann ist

{\displaystyle {\bf {x}}(t):={\bf {b}}_{0}B_{0}^{n}(t)+{\bf {b}}_{1}B_{1}^{n}(t)+\cdots +{\bf {b}}_{n}B_{n}^{n}(t),\quad 0\leq t\leq 1,}

eine (räumliche) Bézier-Kurve vom Grad n. Die Punkte {\displaystyle {\bf {b}}_{0},\cdots ,{\bf {b}}_{n}} sind die Kontrollpunkte der (räumlichen) Bézierkurve. Fasst man die 1-dimensionalen Unterräume

{\displaystyle <{\bf {b}}_{0}B_{0}^{n}(t)+{\bf {b}}_{1}B_{1}^{n}(t)+\cdots +{\bf {b}}_{n}B_{n}^{n}(t)>}

als Punkte der reellen projektiven Ebene mit der Ferngerade x_{3}=0 auf, so bezeichnet man den affinen Anteil (Projektion vom Nullpunkt aus auf die Ebene x_{3}=1) dieser projektiven Kurve als rationale Bézierkurve.

Die Kontrollpunkte der Bézierkurve im \mathbb {R} ^{3} lassen sich folgendermaßen beschreiben:

{\displaystyle {\bf {b}}_{i}=w_{i}(x_{i},y_{i},1)^{T},\ w_{i}>0,\ } falls {\displaystyle {\bf {b}}_{i}} nicht auf der Ferngerade x_{3}=0 und
{\displaystyle {\bf {b}}_{i}=w_{i}(x_{i},y_{i},0)^{T},\ w_{i}>0,\ } falls {\displaystyle {\bf {b}}_{i}} auf der Ferngerade liegt.

Beim Übergang zu inhomogenen Koordinaten wird ein Kontrollpunkt entweder auf den affinen Punkt {\displaystyle {\bf {a}}_{i}:=(x_{i},y_{i})^{T}} oder auf den Fernpunkt in Richtung {\displaystyle {\bf {a}}_{i}:=(x_{i},y_{i})^{T}} abgebildet. Der Punkt {\displaystyle {\bf {a}}_{i}} heißt eigentlicher bzw. uneigentlicher Kontrollpunkt der rationalen Bezierkurve und die Zahl w_{i} heißt das Gewicht des Kontrollpunktes {\displaystyle {\bf {a}}_{i}}

wobei {\displaystyle \delta _{i}=1} für eigentliche und {\displaystyle \delta _{i}=0} für uneigentliche Kontrollpunkte zu setzen ist.

Die rationalen Bezierkurven haben (u.a.) die folgenden Eigenschaften:

Sind {\displaystyle {\bf {a}}_{i},w_{i},i=0,\dots ,n,} eigentliche Kontrollpunkte bzw. die Gewichte einer rationalen Bezierkurve \Gamma , so gilt

  1. Die Kurve \Gamma enthält die Kontrollpunkte {\displaystyle {\bf {a}}_{0},{\bf {a}}_{n}} (erster bzw. letzter Punkt des Kontrollpolygons).
  2. Die Tangente im Punkt {\displaystyle {\bf {a}}_{0}} bzw. {\displaystyle {\bf {a}}_{n}} hat die Richtung {\displaystyle {\bf {a}}_{1}-{\bf {a}}_{0}} bzw. {\displaystyle {\bf {a}}_{n}-{\bf {a}}_{n-1}}.
  3. Eine Erhöhung des Gewichts w_{i} bewirkt eine Veränderung der Kurve auf den Kontrollpunkt {\displaystyle {\bf {a}}_{i}} zu. (s. Abbildung)
rationale Bezierkurven mit Gewichten {\displaystyle w_{0}=w_{1}=w_{3}=1} und verschiedenen Gewichten w_{2}

Zusammenfassung:
Eine ebene rationale Bezierkurve besitzt neben dem Kontrollpolygon noch die Gewichte w_{i} als Designparameter. Will man eine Kurve erzeugen, legt man zunächst die Kontrollpunkte {\displaystyle {\bf {a}}_{i}} und die Gewichte w_{i} fest. Dadurch wird dann auch eine räumliche (gewöhnliche) Bezierkurve mit den Kontrollpunkten {\displaystyle {\bf {b}}_{0},{\bf {b}}_{1},\cdots ,{\bf {b}}_{n}} definiert. Die Projektion dieser Kurve (vom Nullpunkt aus) auf die x-y-Ebene (x_{3}=1) liefert dann die ebene rationale Bezierkurve. Eine Variation der Gewichte ändert nicht die Kontrollpunkte {\displaystyle {\bf {a}}_{i}}, aber die (räumlichen) Kontrollpunkte {\displaystyle {\bf {b}}_{i}} und damit die zugehörige räumliche Bezierkurve und schließlich auch die (ebene) rationale Bézierkurve. Erhöht man ein Gewicht w_{i}, so entfernt sich der zugehörige Kontrollpunkt {\displaystyle {\bf {b}}_{i}} vom Nullpunkt und zieht die räumliche Bezierkurve mit. Der zugehörige Kontrollpunkt {\displaystyle {\bf {a}}_{i}} dagegen bleibt unverändert. Die rationale Bezierkurve bewegt sich auf ihn zu (s. Bild). Verringert man das Gewicht, bewegt sich die Kurve von dem Kontrollpunkt weg. Falls alle Gewichte 1 sind, ist die rationale Bézierkurve eine gewöhnliche Bézierkurve mit den Kontrollpunkten {\displaystyle {\bf {a}}_{i}}.

Kegelschnitte als rationale Bézierkurven

Parabel:
Eine Bézierkurve vom Grad zwei mit nicht kollinearen Kontrollpunkten {\displaystyle {\bf {b}}_{0},{\bf {b}}_{1},{\bf {b}}_{2}} im {\displaystyle \mathbb {R} ^{3}/\mathbb {R} ^{2}} ist immer eine Parabel (s. oben). Um eine Parabel als (ganz-)rationale Bezierkurve darzustellen, wählt man drei nicht kollineare Kontrollpunkte {\displaystyle {\bf {a}}_{0},{\bf {a}}_{1},{\bf {a}}_{2}} und setzt {\displaystyle w_{0}=w_{1}=w_{2}=1} und {\displaystyle \delta _{0}=\delta _{1}=\delta _{2}=1}. Letzteres bedeutet: Die Kontrollpunkte sind alle eigentlich.

Ellipsen und Hyperbeln lassen sich durch Zentralprojektion von Parabeln im \mathbb {R} ^{3}, deren Ebenen nicht den Nullpunkt enthalten, auf die Einbettungsebene x_{3}=1 erzeugen.

Hyperbel (rot) als rationale Bezierkurve mit den Kontrollpunkten {\displaystyle {\bf {a}}_{0},{\bf {a}}_{1},{\bf {a}}_{2}}. Sie entsteht durch Projektion der blauen Parabel vom Nullpunkt aus auf die Ebene x_{3}=1. Die Parabelpunkte {\displaystyle {\bf {b}}_{0},{\bf {b}}_{2}} gehen dabei auf die Fernpunkte der Hyperbelasymptoten über.

Hyperbel:
Für die Kontrollpunkte

{\displaystyle \ {\bf {b}}_{0}=(1,0,0)^{T}\ ,\ {\bf {b}}_{1}=(0,0,1/2)^{T}\ ,\ {\bf {b}}_{2}=(0,1,0)^{T}\ }

beschreibt

{\displaystyle {\bf {b}}(t)=t^{2}{\bf {b}}_{0}+2t(1-t){\bf {b}}_{1}+(1-t)^{2}{\bf {b}}_{2}}
{\displaystyle =\left(t^{2},(1-t)^{2},t(1-t)\right)^{T},\quad t\in \mathbb {R} ,}

eine Parabel, die auf dem Kegel mit der Gleichung {\displaystyle \ x_{1}x_{2}=x_{3}^{2}\ } liegt (s. Bild). Die Kontrollpunkte und Gewichte der zugehörigen (ebenen) rationalen Bezierkurve sind:

{\displaystyle \ {\bf {a}}_{0}=(1,0)^{T}\ ,\ {\bf {a}}_{1}=(0,0)^{T}\ ,\ {\bf {a}}_{2}=(0,1)^{T}\quad } bzw. :{\displaystyle \ w_{0}=1\;,\;w_{1}=1/2\;,\;w_{2}=1\ }.

{\displaystyle {\bf {a}}_{0},{\bf {a}}_{2}} sind uneigentliche Kontrollpunkte. Damit ist {\displaystyle \ \delta _{0}=0\;,\;\delta _{1}=1\;,\;\delta _{2}=0\ } und der Nenner (s.o.) der rationalen Komponenten ist {\displaystyle \ t(1-t)\ }.

Also ist die zugehörige rationale Bézierkurve

{\displaystyle {\bf {a}}(t)={\frac {t^{2}{\bf {a}}_{0}+{\tfrac {1}{2}}2t(1-t){\bf {a}}_{1}+(1-t)^{2}{\bf {a}}_{2}}{t(1-t)}}}
{\displaystyle ={\frac {\left(t^{2},(1-t)^{2}\right)^{T}}{t(1-t)}}=\left({\frac {t}{1-t}},{\frac {1-t}{t}}\right)^{T}}

Dies ist eine rationale Parameterdarstellung eines Astes der Hyperbel mit der Gleichung {\displaystyle \ y=1/x\ }.

Die Änderung {\displaystyle \ {\bf {a}}_{0}=(c,0)^{T}\ } liefert eine rationale Bézierdarstellung der Hyperbel y=c/x.

Halbkreis (rot) als rationale Bezierkurve. {\displaystyle {\bf {a}}_{1}} ist uneigentlicher Kontrollpunkt, d.h. hier: Der Vektor {\displaystyle {\bf {a}}_{1}} gibt die Richtung der Tangenten in den Kreispunkten {\displaystyle {\bf {a}}_{0},{\bf {a}}_{2}} an.

Kreis:
In dem folgenden Beispiel sind die Kontrollpunkte der (räumlichen) Parabel:

{\displaystyle {\bf {b}}_{0}=(1,0,1)^{T}\;,\;{\bf {b}}_{1}=(0,1,0)^{T}\;,\;{\bf {b}}_{2}(-1,0,1)^{T}\ }.

Die Bézierkurve

{\displaystyle {\bf {b}}(t)=t^{2}{\bf {b}}_{0}+2t(1-t){\bf {b}}_{1}+(1-t)^{2}{\bf {b}}_{2}}
{\displaystyle =\left(t^{2}-(1-t)^{2},2t(1-t),t^{2}+(1-t)^{2}\right)^{T}}

liegt in diesem Fall auf dem Kegel mit der Gleichung {\displaystyle \ x_{1}^{2}+x_{2}^{2}=x_{3}^{2}\ } (s. Abbildung). Die Kontrollpunkte und Gewichte der zu gehörigen rationalen Bezierkurve sind:

{\displaystyle \ {\bf {a}}_{0}=(1,0)^{T}\ ,\ {\bf {a}}_{1}=(0,1)^{T}\ ,\ {\bf {a}}_{2}=(-1,0)^{T}\quad } bzw. {\displaystyle \quad w_{0}=w_{1}=w_{2}=1\ }.

{\displaystyle {\bf {a}}_{1}} ist uneigentlicher Kontrollpunkt. Damit ist {\displaystyle \ \delta _{0}=1\;,\;\delta _{1}=0\;,\;\delta _{2}=1\ } und der Nenner (s.o.) der rationalen Komponenten ist {\displaystyle \ t^{2}+(1-t)^{2}\ }.

Also ist die zugehörige rationale Bezierkurve

{\displaystyle {\bf {a}}(t)={\frac {t^{2}{\bf {a}}_{0}+2t(1-t){\bf {a}}_{1}+(1-t)^{2}{\bf {a}}_{2}}{t^{2}+(1-t)^{2}}}}
{\displaystyle ={\frac {\left(t^{2}-(1-t)^{2},2t(1-t)\right)^{T}}{t^{2}+(1-t)^{2}}}}
{\displaystyle =\left({\frac {t^{2}-(1-t)^{2}}{t^{2}+(1-t)^{2}}}\;,\;{\frac {2t(1-t)}{t^{2}+(1-t)^{2}}}\right)^{T}}

Für {\displaystyle 0\leq t\leq 1} ist dies eine rationale Parameterdarstellung eines halben Einheitskreises.

Setzt man {\displaystyle \ {\bf {a}}_{0}=(a,0)^{T}\ ,\ {\bf {a}}_{1}=(0,b)^{T}\ ,\ {\bf {a}}_{2}=(-a,0)^{T},\;a>0,b>0,\ } erhält man eine rationale Bézierdarstellung der Ellipse mit der Gleichung {\displaystyle \ {\frac {x^{2}}{a^{2}}}+{\frac {y^{2}}{b^{2}}}=1\ }.

Anwendung: Kreisapproximation durch kubische Bézierkurven

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.)

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:

Als einfaches Beispiel einer Viertelkreisapproximation wählen wir:

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:

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}}};\quad 0\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)\approx 0{,}55228

Der Fehler ist Null bei t\in \left\lbrace 0;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}}\approx 0{,}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:

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 {\displaystyle f_{\kappa }(t)=2{,}65\,\%}. Dies ist bzgl. der maximalen Abweichung etwa 50 mal schlechter als die Viertelkreisapproximation.

Literatur

Trenner
Basierend auf einem Artikel in: Extern Wikipedia.de
Seitenende
Seite zurück
©  biancahoegel.de
Datum der letzten Änderung: Jena, den: 19.04. 2023