מתוך ויקיפדיה, האנציקלופדיה החופשית
באנליזה נומרית , אלגוריתם דה-קַסְטַלְז'וּ מתאר שיטה רקורסיבית כדי להעריך פולינום ברנשטיין או עקומות בזייר , הקרויה על שם ממציאהּ, פול-דה-קסטלז'ו. אלגוריתם דה-קסטלז'ו יכול לשמש גם כדי לפצל עקומת בזייר יחידה לשתי עקומות בזייר בעזרת פרמטר בעל ערך שרירותי.
למרות שהוא איטי יותר במרבית הארכיטקטורות בהשוואה לגישה הישירה, הוא יציב יותר מבחינה נומרית .
עקומת בזייר B (בדרגה n , עם נקודות הבקרה
β
0
,
…
,
β
n
{\displaystyle \beta _{0},\ldots ,\beta _{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 הוא פולינום בסיס מתצורת ברנשטיין
b
i
,
n
(
t
)
=
(
n
i
)
(
1
−
t
)
n
−
i
t
i
{\displaystyle b_{i,n}(t)={n \choose i}(1-t)^{n-i}t^{i}}
.
העקומה בנקודה t 0 ניתנת להערכה בעזרת נוסחת נסיגה
β
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)}}
כאשר עושים את החישוב באופן ידני, שימושי לכתוב את המקדמים במשולש כ:
β
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}}}
בעת בחירת נקודה t 0 כדי להעריך את פולינום ברנשטיין אנחנו יכולים להשתמש בשני האלכסונים של המשולש כדי לבנות חלוקה של פולינום
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
β
i
(
n
−
i
)
b
i
,
n
(
t
−
t
0
1
−
t
0
)
,
t
∈
[
t
0
,
1
]
{\displaystyle B_{2}(t)=\sum _{i=0}^{n}\beta _{i}^{(n-i)}b_{i,n}\left({\frac {t-t_{0}}{1-t_{0}}}\right){\mbox{ , }}\qquad t\in [t_{0},1]}
אנחנו רוצים להעריך את פולינום ברנשטיין מדרגה 2 עם מקדמי ברנשטיין
β
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}}
בנקודה t 0
אנחנו מתחילים את הרקורסיה עם
β
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}}}
אשר הוא הפולינום ברנשטיין הצפוי מדרגה 2 .
בעת הערכת עקומת בזייר מדרגה n במרחב 3-ממדי עם n +1 נקודות בקרה, P i
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}}
. התוצאה של נקודות ארבעה-ממדיות עשויות להיות מוטלות בחזרה לתוך מרחב תלת־ממדי עם מטריצת מעבר כלשהי.
באופן כללי, פעולות על עקומה רציונלית (או משטח) שוות ערך ל פעולות על עקומה לא-רציונלית במרחב פרויקטיבי . ייצוג זה כ"נקודות בקרה משוקללות" ומשקולות הוא לעיתים קרובות נוח בעת הערכת עקומות רציונליות.