prev up inhalt next


7.3 Bézier-Kurven

Spezifiziere die Kurve durch n + 1 Stützpunkte P0,P1,...,Pn . Die Kurve läuft nicht durch alle Stützpunkte, sondern wird von ihnen beeinflußt.

Der Punkt Pi wird gewichtet mit Hilfe eines Bernstein-Polynoms.

Beispiel: n = 3



Die wichtigsten Eigenschaften der Bernsteinpolynome:

Da alle Bernsteinpolynome für 0 < t < 1 ungleich Null sind, beeinflussen alle Stützpunkte in diesem Intervall den Kurvenverlauf.
Die Kurve beginnt im Stützpunkt P0 tangential zur Geraden , endet im Stützpunkt Pn tangential zur Geraden und verläuft innerhalb der konvexen Hülle der Stützpunkte. Somit können mehrere Bézier-Kurven aneinandergesetzt werden durch Identifikation von Endpunkt und Anfangspunkt aufeinanderfolgender Bézierkurven. Einen stetig differenzierbaren Übergang erreicht man bei Kollinearität der Punkte Pn - 1,Pn = Q0,Q1 .

Berechnung der Bézier-Kurve nach de Casteljau

Es gilt:

wobei die tiefgestellten Indizes angeben, welche Stützpunkte in die Berechnung einfließen. D.h. eine Bézier-Kurve vom Grad n läßt sich durch zwei Bézier-Kurven vom Grad n - 1 definieren, indem für ein festes t die Punkte beider Kurven berechnet werden, und die Verbindungsstrecke im Verhältnis t geteilt wird.


Berechnung eines Kurvenpunktes für t = . Die Indizes geben an, welche Stützpunkte beteiligt sind.

/****************************************************************************************/
/*                                                                                      */
/*                      Zeichnen einer Bezierkurve 3. Grades nach De Casteljau          */
/*                                                                                      */
/****************************************************************************************/

private void bezier(                            // Zeichne eine Bezierkurve 3. Grades
                     double px0, double py0,    // anhand des Stuetzpunktes p0
                     double px1, double py1,    // anhand des Stuetzpunktes p1
                     double px2, double py2,    // anhand des Stuetzpunktes p2
                     double px3, double py3,    // anhand des Stuetzpunktes p3
                     int depth)                 // aktuelle Rekursionstiefe
{
        double qx01,qy01,qx12,qy12,qx23,qy23,qx012,qy012,qx123,qy123,qx0123,qy0123;
                                                // Hilfspunkte

        if (depth > iter)                       // Iterationstiefe erreicht
                set_line( new Point( (int)px0, (int)py0), new Point( (int)px3, (int)py3));
        else {
                depth++;

                qx01   = (px0+px1)/2;     qy01   = (py0+py1)/2;
                qx12   = (px1+px2)/2;     qy12   = (py1+py2)/2;
                qx23   = (px2+px3)/2;     qy23   = (py2+py3)/2;
                qx012  = (qx01+qx12)/2;   qy012  = (qy01+qy12)/2;
                qx123  = (qx12+qx23)/2;   qy123  = (qy12+qy23)/2;
                qx0123 = (qx012+qx123)/2; qy0123 = (qy012+qy123)/2;

                bezier (px0,py0,qx01,qy01,qx012,qy012,qx0123,qy0123,depth);
                bezier (qx0123,qy0123,qx123,qy123,qx23,qy23,px3,py3,depth);
        }
}


Vom De Casteljau-Algorithmus mit Rekursionstiefe 3 gezeichnete Bézierkurven


prev up inhalt next