Αλγόριθμος του ντε Καστελζώ

Στο μαθηματικό πεδίο της αριθμητικής ανάλυσης, ο αλγόριθμος του ντε Καστελζώ (de Casteljau) αποτελεί μία αναδρομική μέθοδο εκτίμησης πολυωνύμων Μπέρνσταϊν ή καμπυλών Μπεζιέ. Ο αλγόριθμος του ντε Καστελζώ μπορεί επίσης να χρησιμοποιηθεί για το "σπάσιμο" μίας καμπύλης Μπεζιέ σε δύο για μία αυθαίρετη παραμετρική τιμή.Το όνομά του το πήρε από τον εφευρέτη του Πωλ ντε Καστελζώ. Παρόλο που θεωρείται αργός ως αλγόριθμος, εμφανίζει ιδιαίτερη αριθμητική ευστάθεια.

 Έστω ένα πολυώνυμο B σε μορφή Μπέρνσταϊν βαθμού n B ( t ) = ∑ i = 0 n β i b i , n ( t ) , {\displaystyle B(t)=\sum _{i=0}^{n}\beta _{i}b_{i,n}(t),} όπου b ένα πολυώνυμο βάσης Μπέρνσταϊν, το πολυώνυμο στο σημείο t0 μπορεί να εκτκιμηθεί με την αναδρομική σχέση β i ( 0 ) := β i , i = 0 , … , n {\displaystyle \beta _{i}^{(0)}:=\beta _{i}{\mbox{ , }}i=0,\ldots ,n} β i ( j ) := β i ( j − 1 ) ( 1 − t 0 ) + β i + 1 ( j − 1 ) t 0 , i = 0 , … , n − j , j = 1 , … , n {\displaystyle \beta _{i}^{(j)}:=\beta _{i}^{(j-1)}(1-t_{0})+\beta _{i+1}^{(j-1)}t_{0}{\mbox{ , }}i=0,\ldots ,n-j{\mbox{ , }}j=1,\ldots ,n} Τότε, η εκτίμηση του B {\displaystyle B} σε σημείο t 0 {\displaystyle t_{0}} μπορεί να εκτιμηθεί σε n {\displaystyle n} βήματα του αλγορίθμου. Το αποτέλεσμα B ( t 0 ) {\displaystyle B(t_{0})} δίνεται από : B ( t 0 ) = β 0 ( n ) . {\displaystyle B(t_{0})=\beta _{0}^{(n)}.} Επιπλέον, η καμπύλη Μπεζιέ B {\displaystyle B} μπορεί να διασπαστεί σε σημείο t 0 {\displaystyle t_{0}} σε δύο καμπύλες με αντίστοιχα σημεία ελέγχου : β 0 ( 0 ) , β 0 ( 1 ) , … , β 0 ( n ) {\displaystyle \beta _{0}^{(0)},\beta _{0}^{(1)},\ldots ,\beta _{0}^{(n)}} β 0 ( n ) , β 1 ( n − 1 ) , … , β n ( 0 ) {\displaystyle \beta _{0}^{(n)},\beta _{1}^{(n-1)},\ldots ,\beta _{n}^{(0)}} Ανάπτυξη παραδείγματος του αλγόριθμου του ντε Καστελζώ σε Haskell: Όταν γίνεται ο υπολογισμός με το χέρι είναι χρήσιμο να καταγράφονται οι συντελεστές σχηματίζοντας ένα τρίγωνο όπως αυτό που ακολουθεί: β 0 = β 0 ( 0 ) β 0 ( 1 ) β 1 = β 1 ( 0 ) ⋱ ⋮ ⋮ β 0 ( n ) β n − 1 = β n − 1 ( 0 ) β n − 1 ( 1 ) β n = β n ( 0 ) {\displaystyle {\begin{matrix}\beta _{0}&=\beta _{0}^{(0)}&&&\\&&\beta _{0}^{(1)}&&\\\beta _{1}&=\beta _{1}^{(0)}&&&\\&&&\ddots &\\\vdots &&\vdots &&\beta _{0}^{(n)}\\&&&&\\\beta _{n-1}&=\beta _{n-1}^{(0)}&&&\\&&\beta _{n-1}^{(1)}&&\\\beta _{n}&=\beta _{n}^{(0)}&&&\\\end{matrix}}} Όταν επιλέγεται ένα σημείο t0 για την εκτίμηση ενός πολυωνύμου Μπέρνσταϊν χρησιμοποιούνται οι δύο διαγώνιες του τριγώνου για την κατασκευή τμήματος αυτού B ( t ) = ∑ i = 0 n β i ( 0 ) b i , n ( t ) , t ∈ [ 0 , 1 ] {\displaystyle B(t)=\sum _{i=0}^{n}\beta _{i}^{(0)}b_{i,n}(t){\mbox{ , }}\qquad t\in [0,1]} σε B 1 ( t ) = ∑ i = 0 n β 0 ( i ) b i , n ( t t 0 ) , t ∈ [ 0 , t 0 ] {\displaystyle B_{1}(t)=\sum _{i=0}^{n}\beta _{0}^{(i)}b_{i,n}\left({\frac {t}{t_{0}}}\right){\mbox{ , }}\qquad t\in [0,t_{0}]} και B 2 ( t ) = ∑ i = 0 n β n − i ( i ) b i , n ( t − t 0 1 − t 0 ) , t ∈ [ t 0 , 1 ] {\displaystyle B_{2}(t)=\sum _{i=0}^{n}\beta _{n-i}^{(i)}b_{i,n}\left({\frac {t-t_{0}}{1-t_{0}}}\right){\mbox{ , }}\qquad t\in [t_{0},1]} Έστω ότι θέλουμε να υπολογίσουμε το πολυώνυμο Μπέρνσταϊν δευτέρου βαθμού με συντελεστές Μπέρνσταϊν β 0 ( 0 ) = β 0 {\displaystyle \beta _{0}^{(0)}=\beta _{0}} β 1 ( 0 ) = β 1 {\displaystyle \beta _{1}^{(0)}=\beta _{1}} β 2 ( 0 ) = β 2 {\displaystyle \beta _{2}^{(0)}=\beta _{2}} στο σημείο t0. Ξεκινάμε την αναδρομική σχέση με β 0 ( 1 ) = β 0 ( 0 ) ( 1 − t 0 ) + β 1 ( 0 ) t 0 = β 0 ( 1 − t 0 ) + β 1 t 0 {\displaystyle \beta _{0}^{(1)}=\beta _{0}^{(0)}(1-t_{0})+\beta _{1}^{(0)}t_{0}=\beta _{0}(1-t_{0})+\beta _{1}t_{0}} β 1 ( 1 ) = β 1 ( 0 ) ( 1 − t 0 ) + β 2 ( 0 ) t 0 = β 1 ( 1 − t 0 ) + β 2 t 0 {\displaystyle \beta _{1}^{(1)}=\beta _{1}^{(0)}(1-t_{0})+\beta _{2}^{(0)}t_{0}=\beta _{1}(1-t_{0})+\beta _{2}t_{0}} και με τη δεύτερη επανάληψη η αναδρομή σταματάει με β 0 ( 2 ) = β 0 ( 1 ) ( 1 − t 0 ) + β 1 ( 1 ) t 0 = β 0 ( 1 − t 0 ) ( 1 − t 0 ) + β 1 t 0 ( 1 − t 0 ) + β 1 ( 1 − t 0 ) t 0 + β 2 t 0 t 0 = β 0 ( 1 − t 0 ) 2 + β 1 2 t 0 ( 1 − t 0 ) + β 2 t 0 2 {\displaystyle {\begin{aligned}\beta _{0}^{(2)}&=\beta _{0}^{(1)}(1-t_{0})+\beta _{1}^{(1)}t_{0}\\\ &=\beta _{0}(1-t_{0})(1-t_{0})+\beta _{1}t_{0}(1-t_{0})+\beta _{1}(1-t_{0})t_{0}+\beta _{2}t_{0}t_{0}\\\ &=\beta _{0}(1-t_{0})^{2}+\beta _{1}2t_{0}(1-t_{0})+\beta _{2}t_{0}^{2}\end{aligned}}} που είναι το αναμενόμενο πολυώνυμο Μπέρνσταϊν βαθμού n. Όταν εκτιμάται μία καμπύλη Μπεζιέ βαθμού n στο τριδιάστατο χώρο, με n+1 σημεία ελέγχου Pi B ( t ) = ∑ i = 0 n P i b i , n ( t ) , t ∈ [ 0 , 1 ] {\displaystyle \mathbf {B} (t)=\sum _{i=0}^{n}\mathbf {P} _{i}b_{i,n}(t){\mbox{ , }}t\in [0,1]} με P i := ( x i y i z i ) {\displaystyle \mathbf {P} _{i}:={\begin{pmatrix}x_{i}\\y_{i}\\z_{i}\end{pmatrix}}} .Χωρίζουμε την καμπύλη Μπεζιέ σε τρεις ισότητες: B 1 ( t ) = ∑ i = 0 n x i b i , n ( t ) , t ∈ [ 0 , 1 ] {\displaystyle B_{1}(t)=\sum _{i=0}^{n}x_{i}b_{i,n}(t){\mbox{ , }}t\in [0,1]} B 2 ( t ) = ∑ i = 0 n y i b i , n ( t ) , t ∈ [ 0 , 1 ] {\displaystyle B_{2}(t)=\sum _{i=0}^{n}y_{i}b_{i,n}(t){\mbox{ , }}t\in [0,1]} B 3 ( t ) = ∑ i = 0 n z i b i , n ( t ) , t ∈ [ 0 , 1 ] {\displaystyle B_{3}(t)=\sum _{i=0}^{n}z_{i}b_{i,n}(t){\mbox{ , }}t\in [0,1]} τις οποίες εκτιμάμε ξεχωριστά, χρησιμοποιώντας τον αλγόριθμο του ντε Καστελζώ. Η γεωμετρική ερμηνεία του αλγόριθμου του ντε Καστελζώ είναι απλή. Θεωρούμε μία καμπύλη Μπεζιέ με σημεία ελέγχου P 0 , . . . , P n {\displaystyle \scriptstyle P_{0},...,P_{n}} . Ενώνοντας τα συνεχόμενα σημεία δημιουργείται το πολύγωνο ελέγχου της καμπύλης. Στη συνέχεια, υποδιαιρούμε κάθε ευθύγραμμο τμήμα του πολυγώνου αυτού με ρυθμό t : ( 1 − t ) {\displaystyle \scriptstyle t:(1-t)} και συνδέουμε τα σημεία που παίρνουμε. Με το τρόπο αυτό φτάνουμε σε ένα νέο πολύγωνο το οποίο έχει ένα τμήμα λιγότερο. Η διαδικασία επαναλαμβάνεται μέχρι να φτάσουμε στο ενιαίο σημείο - αυτό είναι το σημείο της καμπύλης που αντιστοιχεί στην παράμετρο t {\displaystyle \scriptstyle t} .Η ακόλουθη εικόνα δείχνει αυτήν τη διαδικασία για μία κυβική καμπύλη Μπεζιέ: Σημειώστε ότι τα ενδιάμεσα σημεία που δημιουργήθηκαν είναι στην ουσία τα σημεία ελέγχου των δύο νέων καμπυλών Μπεζιέ, οι οποίες συμπίπτουν ακριβώς με την αρχική. Ο αλγόριθμος αυτός δεν υπολογίζει μόνο την καμπύλη στο t {\displaystyle \scriptstyle t} , αλλά επίσης σπάει την καμπύλη σε δύο κομμάτια στο t {\displaystyle \scriptstyle t} , και παρέχει τις εξισώσεις των δύο υποκαμπυλών σε μορφή Μπεζιέ. Η παραπάνω ερμηνεία ισχύει και για μη λογικές καμπύλες Μπεζιέ. Για να εκτιμήσουμε μία λογική καμπύλη Μπεζιέ σε R n {\displaystyle \scriptstyle \mathbf {R} ^{n}} , μπορούμε να προβάλλουμε το σημείο στο R n + 1 {\displaystyle \scriptstyle \mathbf {R} ^{n+1}} . Για παράδειγμα, μία καμπύλη σε τρεις διαστάσεις μπορεί να έχει τα σημεία ελέγχου της { ( x i , y i , z i ) } {\displaystyle \scriptstyle \{(x_{i},y_{i},z_{i})\}} και βάρη { w i } {\displaystyle \scriptstyle \{w_{i}\}} προβαλλόμενα στα σταθμισμένα σημεία ελέγχου { ( w i x i , w i y i , w i z i , w i ) } {\displaystyle \scriptstyle \{(w_{i}x_{i},w_{i}y_{i},w_{i}z_{i},w_{i})\}} . Τότε ο αλγόριθμος συνεχίζει με το συνήθει τρόπο, παρεμβάλλοντας στα R 4 {\displaystyle \scriptstyle \mathbf {R} ^{4}} . Τα τετραδιάστατα σημεία που προκύπτουν μπορούν να προβληθούν πίσω στον τρισδιάστατο χώρο με ένα προβολικό μετασχηματισμό. Γενικά, εφαρμογές σε μία λογική καμπύλη (ή επιφάνεια) ισοδυναμεί με εφαρμογές σε μία μή λογική καμπύλη σε ένα προβολικό χώρο. Η αναπαράσταση ως "σταθμισμένα σημεία ελέγχου" και βάρη συχνά βολεύει στις περιπτώσεις που έχουμε να εκτιμήσουμε λογικές καμπύλες. Farin, Gerald & Hansford, Dianne (2000). The Essentials of CAGD. Natic, MA: A K Peters, Ltd. ISBN 1-56881-123-3 Καμπύλη Μπεζιέ Αλγόριθμος ντε Μπουρ Σχήμα Χόρνερ Αλγόριθμος Κλένσο