De-Casteljau-Algorithmus

Der Algorithmus von de Casteljau ermöglicht die effiziente Berechnung einer beliebig genauen Näherungsdarstellung von Bézierkurven durch einen Polygonzug. Der Algorithmus wurde Anfang der 1960er Jahre von Paul de Faget de Casteljau bei Citroën entwickelt.

Idee

Der Algorithmus von de Casteljau beruht darauf, dass eine Bézierkurve geteilt und durch zwei aneinandergesetzte Bézierkurven dargestellt werden kann. Diese Unterteilung kann rekursiv fortgesetzt werden. Das Kontrollpolygon der zusammengesetzten Bézierkurve nähert sich dabei der Originalkurve an. Nach ausreichend vielen Verfeinerungsschritten kann der entstandene Polygonzug als Näherung für die Originalkurve verwendet werden. Ein Verfeinerungsschritt, der das Kontrollpolygon einer Ausgangskurve in ein Kontrollpolygon einer zusammengesetzten Kurve zerlegt, besteht nur aus wenigen einfachen Teilungen von Polygonkanten.

Darüber hinaus ermöglicht der Algorithmus die schnelle Bestimmung jedes einzelnen Punktes auf der Bézierkurve durch seine parametrische Darstellung.

Erweiterungen findet der Algorithmus im Blossoming wie auch im fokalen Algorithmus von de Casteljau.

Algorithmus

Gegeben sind die Kontrollpunkte {\displaystyle P_{0},\ P_{1},\ \dots ,\ P_{n}} der Ausgangskurve {\displaystyle C(t)=\sum _{i=0}^{n}B_{i,n}(t)P_{i}} mit t \in [0, 1].

Von den Kontrollpunkten der Ausgangskurve C(t) liegen im Allgemeinen nur P_{0} und P_{n} auf der Kurve. Der Algorithmus berechnet im ersten Schritt einen weiteren Punkt {\displaystyle C(t_{0})} der Kurve. Dabei kann {\displaystyle t_{0}\in {]0,1[}} frei gewählt werden. Die Kurve wird im Weiteren an diesem Punkt {\displaystyle C(t_{0})} geteilt. Es bietet sich daher die Wahl von {\displaystyle t_{0}={\frac {1}{2}}} an, weil dies eine gleichmäßige Aufteilung und damit eine schnelle Annäherung des Kontrollpolygons an die Ausgangskurve gewährleistet.

Bilden von Teilverhältnissen

Konstruktion der ersten Folge von Hilfspunkten Pi(1) aus den Ausgangspunkten Pi(0).

Statt durch direktes Einsetzen von t_{0} in die Gleichung der Kurve C(t) geschieht die Berechnung von {\displaystyle C(t_{0})} über die Konstruktion von Punkten {\displaystyle P_{i}^{(k)}} aus den gegebenen Kontrollpunkten {\displaystyle P_{0},\ \dots \ P_{n}}. Die Konstruktion startet mit den Ausgangspunkten {\displaystyle P_{i}^{(0)}=P_{i}}. Aus diesen werden durch Teilen der Verbindungslinien {\displaystyle {\overline {P_{i}^{(k)}P_{i+1}^{(k)}}}} im Verhältnis {\displaystyle t_{0}\ :\ 1-t_{0}} neue Punkte {\displaystyle P_{i}^{(k+1)}} konstruiert. Der Punkt {\displaystyle P_{i}^{(k+1)}} berechnet sich nach der intuitiv einsichtigen Formel:

{\displaystyle P_{i}^{(k+1)}=(1-t_{0})\cdot P_{i}^{(k)}+t_{0}\cdot P_{i+1}^{(k)}}

In nebenstehender Abbildung sind die Punkte {\displaystyle P_{i}^{(1)}}, die aus den Ausgangspunkten {\displaystyle P_{i}^{(0)}=P_{i}} hervorgegangen sind, rot eingezeichnet. Durch Fortsetzen der Berechnungsvorschrift werden in gleicher Weise Punkte {\displaystyle P_{i}^{(2)},\ P_{i}^{(3)},\ \dots ,\ P_{i}^{(n)}} bestimmt. Zur Berechnung von {\displaystyle P_{i}^{(2)}} werden dazu die blau gestrichelten Verbindungslinien der im ersten Schritt berechneten Punkte {\displaystyle {\overline {P_{i}^{(1)}P_{i+1}^{(1)}}}} im selben Verhältnis geteilt usw.

Konstruktion eines Kurvenpunktes

Es gilt die folgende Aussage (siehe Beweis der Punktkonstruktion):

{\displaystyle C(t_{0})=P_{0}^{(n)}}
Komplette Konstruktion von P0(3) für n=3

Das heißt, dass der Punkt {\displaystyle P_{0}^{(n)}}, welcher in der nten Iteration durch fortgesetztes Streckenteilen konstruiert wird, ein Punkt der Kurve ist. Das Teilungsverhältnis t_{0} bestimmt dabei seine Lage auf der Kurve.

In nebenstehender Abbildung ist die Konstruktion für n=3 vollständig durchgeführt. Der Punkt {\displaystyle P_{0}^{(3)}}, der durch dreifache Anwendung der Teilungsvorschrift aus den Ausgangspunkten {\displaystyle P_{0},\ \dots ,\ P_{3}} hervorgegangen ist, liegt auf der gesuchten Kurve.

Die bei weitem interessantere Aussage ist aber, dass dieser Punkt {\displaystyle P_{0}^{(n)}} die Kurve C(t) in zwei Bézierkurven {\displaystyle C_{1}(t)} und {\displaystyle C_{2}(t)} teilt und dass die Punkte {\displaystyle P_{0}^{(i)}\ (i=0\dots n)} das Kontrollpolygon von {\displaystyle C_{1}(t)} und die Punkte {\displaystyle P_{i}^{(n-i)}\ (i=0\dots n)} das Kontrollpolygon von {\displaystyle C_{2}(t)} bilden.

Teilen in zwei Bézierkurven

Zerlegung von C(t) in C1(t) und C2(t)

Nebenstehende Abbildung zeigt die Zerlegung von C(t) in {\displaystyle C_{1}(t)} und {\displaystyle C_{2}(t)} für n=3. Dabei bilden die Punkte {\displaystyle P_{0}^{(0)}}, {\displaystyle P_{0}^{(1)}}, {\displaystyle P_{0}^{(2)}} und {\displaystyle P_{0}^{(3)}} das Kontrollpolygon von {\displaystyle C_{1}(t)} und entsprechend die Punkte {\displaystyle P_{0}^{(3)}}, {\displaystyle P_{1}^{(2)}}, {\displaystyle P_{2}^{(1)}} und {\displaystyle P_{3}^{(0)}} das Kontrollpolygon von {\displaystyle C_{2}(t)}.

An der Abbildung erkennt man außerdem, warum in der Regel ein Teilungsverhältnis von {\displaystyle t_{0}={\frac {1}{2}}} verwendet wird. Da in diesem Beispiel ein Teilungsverhältnis kleiner ½ verwendet wurde, teilt sich die Kurve C(t) in einem ungleichen Verhältnis in eine kurze Kurve {\displaystyle C_{1}(t)} und eine lange Kurve {\displaystyle C_{2}(t)} auf. Der kürzere Teil ist viel besser an sein Kontrollpolygon angenähert als der längere. Möchte man (bei ungefähr gleich langen Strecken des Ausgangskontrollpolygons) eine gleichmäßige Näherung erreichen, eignet sich dazu das Teilungsverhältnis {\displaystyle t_{0}={\frac {1}{2}}}.

Die Unterteilung der Kurven wird so lange fortgesetzt, bis sie hinreichend genau durch ihre Kontrollpolygone angenähert sind.

Pseudocode

Zu Beginn liegen die Punkte des Kontrollpolygons in einem Feld {\displaystyle P_{i},\ i=0\ldots n} vor. Bei gegebenem Parameter t_{0} wird der Punkt {\displaystyle C(t_{0})} folgendermaßen berechnet:

BEGIN
    FOR i:=0..n
        {\displaystyle P_{i}^{(0)}:=P_{i}}

    FOR j:=1..n
        FOR i:=0..(n-j)
            // Unterteilung mit Faktor t
            {\displaystyle P_{i}^{(j)}=(1-t_{0})\cdot P_{i}^{(j-1)}+t_{0}\cdot P_{i+1}^{(j-1)}} 

    RETURN {\displaystyle P_{0}^{(n)}}
END

Der obige Algorithmus ist insoweit unvollständig, dass nur der Punkt {\displaystyle C(t_{0})} bestimmt, aber keine fortgesetzte Unterteilung von C(t) durchgeführt wird. Der Algorithmus ist nicht speichereffizient, da für alle {\displaystyle P_{i}^{(j)}} neue Speicherplätze belegt werden.

Beweis der Punktkonstruktion

Die Aussage, dass über n-fach fortgesetzte Streckenteilung ein weiterer Punkt der Kurve konstruiert werden kann, lässt sich über Lösen der Rekursion beweisen, die {\displaystyle P_{i}^{(j)}} definiert.

Rekursionsgleichung

Die Rekursionsgleichung definiert die Punkte {\displaystyle P_{i}^{(k)}} in Abhängigkeit von den in der letzten Iteration berechneten Punkten {\displaystyle P_{i}^{(k-1)}}. Den Start der Rekursion bilden die Punkte P_{i}:

{\displaystyle P_{i}^{(0)}=P_{i}}
{\displaystyle P_{i}^{(k)}=(1-t_{0})\cdot P_{i}^{(k-1)}+t_{0}\cdot P_{i+1}^{(k-1)}}

Zu beweisende Aussage

Zu beweisen ist die Aussage, dass der Punkt {\displaystyle P_{0}^{(n)}} ein Punkt der Kurve an der Stelle t_{0} ist:

{\displaystyle P_{0}^{(n)}=C(t_{0})}

Verallgemeinerung der Aussage

Um eine Lösung der Rekursion für den speziellen Punkt {\displaystyle P_{0}^{(n)}} zu finden, wird eine geschlossene Form für alle Punkte {\displaystyle P_{i}^{(k)}} der Rekursion gesucht und gezeigt, dass diese insbesondere für {\displaystyle P_{0}^{(n)}} das gesuchte Resultat liefert. Der Beweis für {\displaystyle P_{i}^{(k)}} wird über vollständige Induktion mit folgender Induktionsannahme geführt:

{\displaystyle P_{i}^{(k)}=\sum _{m=0}^{k}P_{i+m}{k \choose m}t_{0}^{m}(1-t_{0})^{k-m}}.

Der Induktionsschritt ist dann eine gradlinige Rechnung, bei der Aussagen über Binomialkoeffizienten benutzt werden.

Anwendung

Mit Hilfe des Algorithmus von de Casteljau ist es möglich, Näherungen von Bézierkurven durch gerade Linien zu errechnen. Dadurch kann eine Bézierkurve effizient mit dem Rechner gezeichnet werden.

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