Bezjeove krive

Bezijerova kriva trećeg stepena čiji poligon nije prost
Animacija Bezijerove krive rađena u programskom jeziku Ruby

Bezjeove krive su parametarske krive. Njihovu najbolju primenu pronalazimo u računarskoj grafici.

Zadaju se određenim brojem kontrolnih tačaka čijim se pomeranjem menja oblik krive. Dodavanjem kontrolnih tačaka se povećava stepen krive, ali i složenost izračunavanja, zbog čega se najčešće koriste krive malog stepena. Takozvanim „lepljenjem“ krivih malog stepena, dobijaju se Bezjeovi splajnovi (složene krive).

Pol Kastelžo i Pjer Bezje su ih prvi koristili pri dizajnu automobila krajem pedesetih godina dvadesetog veka[1].

Definicija Bezjeove krive

Rekurzivna definicija

Ako Bezjeovu krivu određenu pomoću tački P 0 , P 1 , . . . P n {\displaystyle P_{0},P_{1},...P_{n}} označimo kao α P 0 P 1 . . . P n {\displaystyle \alpha _{P_{0}P_{1}...P_{n}}} . Onda:

α P 0 ( t ) = P 0 {\displaystyle \mathbf {\alpha } _{\mathbf {P} _{0}}(t)=\mathbf {P} _{0}} i
α ( t ) = α P 0 P 1 P n ( t ) = ( 1 t ) α P 0 P 1 P n 1 ( t ) + t α P 1 P 2 P n ( t ) {\displaystyle \mathbf {\alpha } (t)=\mathbf {\alpha } _{\mathbf {P} _{0}\mathbf {P} _{1}\ldots \mathbf {P} _{n}}(t)=(1-t)\mathbf {\alpha } _{\mathbf {P} _{0}\mathbf {P} _{1}\ldots \mathbf {P} _{n-1}}(t)+t\mathbf {\alpha } _{\mathbf {P} _{1}\mathbf {P} _{2}\ldots \mathbf {P} _{n}}(t)}

Eksplicitna definicija

Neka je Bezjeova kriva, stepena n 2 {\displaystyle n\geq 2} , zadata pomoću P 0 , P 1 , P 2 . . P n , n 2 {\displaystyle P_{0},P_{1},P_{2}..P_{n},n\geq 2} tačaka ravni. Možemo je predstaviti sledećim polinomom:

α n ( t ) = i = 0 n ( n i ) t i ( 1 t ) n i P i = i = 0 n B i n ( t ) P i , t [ 0 , 1 ] . {\displaystyle \alpha _{n}(t)=\sum _{i=0}^{n}{\binom {n}{i}}t^{i}(1-t)^{n-i}P_{i}=\sum _{i=0}^{n}B_{i}^{n}(t)P_{i},t\in [0,1].}

Tačke P i {\displaystyle P_{i}} pomoću kojih je definisana kriva nazivaju se kontrolne tačke, a polinomi B i n {\displaystyle B_{i}^{n}} Bernstajnovi polinomi, tj. bazne funkcije.

Tačke P 0 , P 1 , P 2 . . P n {\displaystyle P_{0},P_{1},P_{2}..P_{n}} obrazuju kontrolni poligon.

Polinomijalni oblik

Primenom binomne teoreme na definiciju krive dobijamo:

α ( t ) = j = 0 n t j C j {\displaystyle \mathbf {\alpha } (t)=\sum _{j=0}^{n}{t^{j}\mathbf {C} _{j}}}

gde je:

C j = n ! ( n j ) ! i = 0 j ( 1 ) i + j P i i ! ( j i ) ! = m = 0 j 1 ( n m ) i = 0 j ( 1 ) i + j P i i ! ( j i ) ! . {\displaystyle \mathbf {C} _{j}={\frac {n!}{(n-j)!}}\sum _{i=0}^{j}{\frac {(-1)^{i+j}\mathbf {P} _{i}}{i!(j-i)!}}=\prod _{m=0}^{j-1}(n-m)\sum _{i=0}^{j}{\frac {(-1)^{i+j}\mathbf {P} _{i}}{i!(j-i)!}}.}

Izvod

Izvod krive stepena n {\displaystyle n} je:

α ( t ) = n i = 0 n 1 b i , n 1 ( t ) ( P i + 1 P i ) {\displaystyle \mathbf {\alpha } '(t)=n\sum _{i=0}^{n-1}b_{i,n-1}(t)(\mathbf {P} _{i+1}-\mathbf {P} _{i})}

Specijalni slučajevi

Najveću praktičnu primenu imaju Bezjeove krive drugog i trećeg stepena.

Linearna Bezjeova kriva

Bezjeova kriva stepena 1, tj. kriva određena sa samo dve tačke P 0 {\displaystyle P_{0}} i P 1 {\displaystyle P_{1}} , jeste zapravo duž P 0 P 1 {\displaystyle P_{0}P_{1}} , zadata sledećom parametrizacijom:

α 1 ( t ) = ( 1 t ) P 0 + t P 1 , t [ 0 , 1 ] . {\displaystyle \alpha _{1}(t)=(1-t)P_{0}+tP_{1},t\in [0,1].}


Kvadratna Bezjeova kriva

Bezijerova kriva drugog stepena


Bezjeova kriva drugog stepena je deo parabole

Kvadratna Bezjeova kriva zadata je sledećom parametrizacijom:

α 2 ( t ) = ( 1 t ) 2 P 0 + 2 t ( 1 t ) P 1 + t 2 P 2 , t [ 0 , 1 ] . {\displaystyle \alpha _{2}(t)=(1-t)^{2}P_{0}+2t(1-t)P_{1}+t^{2}P_{2},t\in [0,1].}


Bezjeova kriva drugog stepena je deo parabole. Dokaz leži u osobini invarijantnosti afinih preslikavanja.


Izvod:

α ( t ) = 2 ( P 2 2 P 1 + P 0 ) . {\displaystyle \mathbf {\alpha } ''(t)=2(\mathbf {P} _{2}-2\mathbf {P} _{1}+\mathbf {P} _{0})\,.}

Kubna Bezjeova kriva

Bezjeova kriva trećeg stepena

Kriva je zadata pomoću tačaka P 0 , P 1 , P 2 , P 3 {\displaystyle P_{0},P_{1},P_{2},P_{3}} . Počinje u P 0 {\displaystyle P_{0}} , ide prema P 1 {\displaystyle P_{1}} i stiže u P 3 {\displaystyle P_{3}} dolazeći iz smera P 2 {\displaystyle P_{2}} . Uglavnom ne prolazi kroz P 1 {\displaystyle P_{1}} i P 2 {\displaystyle P_{2}} ; ove tačke služe da obezbede dodatne informacije (razdaljina između P 0 {\displaystyle P_{0}} i P 1 {\displaystyle P_{1}} određuje „koliko daleko“ i „koliko brzo“ se kriva kreće prema P 1 {\displaystyle P_{1}} pre nego što skrene ka P 2 {\displaystyle P_{2}} ).

Kubna Bezjeovakriva zadata je sledećom paramtrizacijom:


α 3 ( t ) = ( 1 t ) 3 P 0 + 3 t ( 1 t ) 2 P 1 + 3 t 2 ( 1 t ) P 2 + t 3 P 3 , t [ 0 , 1 ] . {\displaystyle \alpha _{3}(t)=(1-t)^{3}P_{0}+3t(1-t)^{2}P_{1}+3t^{2}(1-t)P_{2}+t^{3}P_{3},t\in [0,1].}



Prvi izvod:

α ( t ) = 3 ( 1 t ) 2 ( P 1 P 0 ) + 6 ( 1 t ) t ( P 2 P 1 ) + 3 t 2 ( P 3 P 2 ) . {\displaystyle \mathbf {\alpha } '(t)=3(1-t)^{2}(\mathbf {P} _{1}-\mathbf {P} _{0})+6(1-t)t(\mathbf {P} _{2}-\mathbf {P} _{1})+3t^{2}(\mathbf {P} _{3}-\mathbf {P} _{2})\,.}


Drugi izvod:

α ( t ) = 6 ( 1 t ) ( P 2 2 P 1 + P 0 ) + 6 t ( P 3 2 P 2 + P 1 ) . {\displaystyle \mathbf {\alpha } ''(t)=6(1-t)(\mathbf {P} _{2}-2\mathbf {P} _{1}+\mathbf {P} _{0})+6t(\mathbf {P} _{3}-2\mathbf {P} _{2}+\mathbf {P} _{1})\,.}

Osobine Bezjeovih krivih

  • Najveći stepen Bezjeove krive α n {\displaystyle \alpha _{n}} definisane sa n + 1 {\displaystyle n+1} kontrolnih tačaka je n {\displaystyle n} .
  • Početna tačka krive je P 0 {\displaystyle P_{0}} , tj. α n ( 0 ) = P 0 {\displaystyle \alpha _{n}(0)=P_{0}}
  • Vektor P 0 P 1 {\displaystyle {\overrightarrow {P_{0}P_{1}}}} je kolinearan tangentnom vektoru krive u tački P 0 {\displaystyle P_{0}} dok je vektor P n 1 P n {\displaystyle {\overrightarrow {P_{n-1}P_{n}}}} kolinearan tangentnom vektoru krive P n {\displaystyle P_{n}} .
  • Osobina nenegativnosti: za t [ 0 , 1 ] {\displaystyle t\in [0,1]} možemo videti da su svi Bernstajnovi polinomi B i n [ 0 , 1 ] {\displaystyle B_{i}^{n}\in [0,1]} , tj. nenegativni su.
  • Osobina konveksnog omotača: Bezjeova kriva koja je određena pomoću n + 1 {\displaystyle n+1} kontrolnih tačka pripada konveksnom omotaču tih tačka. Centar mase tačaka P 0 ( B 0 n ( t ) )   , . . . , P n ( B n n ( t ) ) {\displaystyle P_{0}(B_{0}^{n}(t))\ ,...,P_{n}(B_{n}^{n}(t))} sa pridruženim pozitivnim masama je tačka α n ( t ) {\displaystyle \alpha _{n}(t)} . Na slici je prikazana kriva 6. stepena, a konveksni omotač njenih 7 kontrolnih tačaka je označen roze bojom. Izuzev dve krajnje tačke koje su na rubu, čitava kriva leži unutar omotača.
Konveksni omotač Bezjeove krive Osobina manje varijacije
  • Osobina manje varijacije: nijedna prava ne preseca Bezijerovu krivu više puta nego što seče kontrolnu poligonsku liniju.
  • Osobina afine invarijantnosti: slika Bezjeove krive pri afinom preslikavanju je određena slikama njenih kontrolnih tačaka pri tom istom preslikavanju.

Bezjeova kriva na proizvoljnom segmentu

Osnovni domen Bezjeove krive je segment [ 0 , 1 ] {\displaystyle [0,1]} , ali ga možemo proširiti na proizvoljni segment. U tom slučaju je potrebno izvršiti smenu promenljive t {\displaystyle t} na sledeći način:

u = t a b a {\displaystyle u={\frac {t-a}{b-a}}}

Sada je promenljiva u {\displaystyle u} definisana na intervalu [ 0 , 1 ] {\displaystyle [0,1]} i potrebno ju je zameniti u bazne funkcije kako bi kriva bila definisana na segmentu [ a , b ] {\displaystyle [a,b]} :


B n , i ( t ) = n ! i ! ( n i ) ! ( t a b a ) i ( 1 t a b a ) n i {\displaystyle B_{n,i}(t)={\frac {n!}{i!(n-i)!}}\left({\frac {t-a}{b-a}}\right)^{i}\left(1-{\frac {t-a}{b-a}}\right)^{n-i}}


Pomeranje kontrolnih tačaka

Pomeranje kontrolne tačke Bezjeove krive

Pretpostavimo da je kontrolna tačka P k {\displaystyle P_{k}} pomerena za vektor v {\displaystyle {\vec {v}}} .


Nova kriva je određena tačkama P 0 , P 1 , , P k + v , , P n {\displaystyle P_{0},P_{1},\cdots ,P_{k}+{\vec {v}},\cdots ,P_{n}} i njena jednačina je:

β ( t ) = i = 0 k 1 B n , i ( t ) P i + B n , k ( t ) ( P k + v ) + i = k + 1 n B n , i ( t ) P i = i = 0 n B n , i ( t ) P i + B n , k ( t ) v = α ( t ) + B n , k ( t ) v {\displaystyle {\begin{aligned}\beta (t)&=\sum _{i=0}^{k-1}B_{n,i}(t)P_{i}+B_{n,k}(t)(P_{k}+{\vec {v}})+\sum _{i=k+1}^{n}B_{n,i}(t)P_{i}\\&=\sum _{i=0}^{n}B_{n,i}(t)P_{i}+B_{n,k}(t){\vec {v}}\\&=\alpha (t)+B_{n,k}(t){\vec {v}}\end{aligned}}}


Nova kriva se predstavlja kao zbir početne krive i dodatnog člana B n , k ( t ) v . {\displaystyle B_{n,k}(t){\vec {v}}.} Tačka α ( t ) {\displaystyle \alpha (t)} na novoj krivoj je dobijena translacijom tačke α ( t ) {\displaystyle \alpha (t)} na početnoj krivoj u pravcu v {\displaystyle {\vec {v}}} na rastojanju | B n , k ( t ) v | {\displaystyle {\begin{vmatrix}B_{n,k}(t){\vec {v}}\end{vmatrix}}} . Osim krajnjih tačaka, sve tačke početne krive se pomeraju na nove pozicije.

Pomeranje bilo koje kontrolne tačke Bezjeove krive menja krivu globalno.

Početna kriva na slici je kriva 8. stepena sa 9 kontrolnih tačaka i označena je crnom bojom. Ako kontrolnu tačku P 3 {\displaystyle P_{3}} pomerimo na novu poziciju, crna kriva se menja u crvenu.

Matrična reprezentacija[2]

Kvadratne Bezjeove krive

( 1 , t , t 2 ) [ 1 0 0 2 2 0 1 2 1 ] [ P 0 P 1 P 2 ] {\displaystyle (1,t,t^{2})\left[{\begin{array}{rrr}1&0&0\\{-2}&2&0\\1&{-2}&1\end{array}}\right]{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\end{bmatrix}}}


Kubne Bezjeove krive

[ 1 t t 2 t 3 ] M {\displaystyle {\begin{bmatrix}1&t&t^{2}&t^{3}\end{bmatrix}}M} [ P o P 1 P 2 P 3 ] {\displaystyle {\begin{bmatrix}P_{o}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}}


Gde je M = [ 1 0 0 0 3 3 0 0 3 6 3 0 1 3 3 1 ] {\displaystyle M=\left[{\begin{array}{rrrr}1&0&0&0\\-3&3&0&0\\3&-6&3&0\\-1&3&-3&1\end{array}}\right]}


Odakle se analogijom dobija uopštenje:


[ 1 t t 2 t 3 t n ] M {\displaystyle {\begin{bmatrix}1&t&t^{2}&t^{3}&\cdots &t^{n}\end{bmatrix}}M} [ P o P 1 P 2 P 3 P n ] {\displaystyle {\begin{bmatrix}P_{o}\\P_{1}\\P_{2}\\P_{3}\\\vdots \\P_{n}\end{bmatrix}}}



Podela Bezjeove krive na dva dela korišćenjem matrične reprezentacije

Kvadratna Bezjeova kriva

Razmotrimo sad podelu krive na dva dela pravljenjem reza u tački α ( t ) = α ( t 0 ) , t , t 0 [ 0 , 1 ] {\displaystyle \alpha (t)=\alpha (t_{0}),t,t_{0}\in [0,1]} .

Prva kriva:

β 2 1 ( t ) = ( 1 , t , t 2 ) M S [ 0 , t 0 ] ( P 0 , P 1 , P 2 ) T {\displaystyle {\begin{aligned}\beta _{2}^{1}(t)&=(1,t,t^{2})MS_{[0,t_{0}]}(P_{0},P_{1},P_{2})^{T}\end{aligned}}} ,


gde je S [ 0 , t 0 ] {\displaystyle S_{[0,t_{0}]}} data sa:


S [ 0 , t 0 ] = [ 1 0 0 1 t 0 t 0 0 ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 ] . {\displaystyle {\begin{aligned}S_{[0,t_{0}]}&={\begin{bmatrix}1&0&0\\{1-t_{0}}&t_{0}&0\\{(1-t_{0})^{2}}&{2t_{0}(1-t_{0})}&t_{0}^{2}\end{bmatrix}}.\end{aligned}}}


Temena kontrolnog poligona dobijamo iz:

S [ 0 , t 0 ] [ P 0 P 1 P 2 ] = [ 1 0 0 1 t 0 t 0 0 ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 ] [ P 0 P 1 P 2 ] {\displaystyle S_{[0,t_{0}]}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\end{bmatrix}}={\begin{bmatrix}1&0&0\\{1-t_{0}}&t_{0}&0\\{(1-t_{0})^{2}}&{2t_{0}(1-t_{0})}&t_{0}^{2}\end{bmatrix}}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\end{bmatrix}}}


Za t 0 = 1 2 {\displaystyle t_{0}={\frac {1}{2}}} temena su data sa:


S [ 0 , 1 2 ] [ P 0 P 1 P 2 P 3 ] {\displaystyle S_{[0,{\frac {1}{2}}]}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}} = [ P 0 1 2 ( P 0 + P 1 ) 1 4 ( P 0 + 2 P 1 + P 2 ) ] {\displaystyle ={\begin{bmatrix}P_{0}\\{{\frac {1}{2}}(P_{0}+P_{1})}\\{{\frac {1}{4}}(P_{0}+2P_{1}+P_{2})}\end{bmatrix}}}



Druga kriva β 2 2 ( t ) {\displaystyle \beta _{2}^{2}(t)} je definisana sa:


β 2 2 ( t ) = α ( t 0 + ( 1 t 0 ) t ) = ( 1 , t , t 2 ) M S [ 1 t 0 , 1 ] ( P 0 , P 1 , P 2 ) T {\displaystyle \beta _{2}^{2}(t)=\alpha (t_{0}+(1-t_{0})t)=(1,t,t^{2})MS_{[1-t_{0},1]}(P_{0},P_{1},P_{2})^{T}} ,


gde je:


S [ 1 t 0 , 1 ] = [ ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 0 ( 1 t 0 ) t 0 0 0 1 ] {\displaystyle S_{[1-t_{0},1]}={\begin{bmatrix}{(1-t_{0})^{2}}&{-2t_{0}(1-t_{0})}&{t_{0}^{2}}\\0&(1-t_{0})&t_{0}\\0&0&1\end{bmatrix}}} .



Kontrolni poligon je određen sledećim tačkama:


S [ 1 t 0 , 1 ] [ P 0 P 1 P 2 ] = [ ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 0 ( 1 t 0 ) t 0 0 0 1 ] [ P 0 P 1 P 2 ] {\displaystyle S_{[1-t_{0},1]}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\end{bmatrix}}={\begin{bmatrix}{(1-t_{0})^{2}}&{-2t_{0}(1-t_{0})}&{t_{0}^{2}}\\0&(1-t_{0})&t_{0}\\0&0&1\end{bmatrix}}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\end{bmatrix}}} .


tj. za t 0 = 1 2 {\displaystyle t_{0}={\frac {1}{2}}} :


S [ 1 2 , 1 ] [ P 0 P 1 P 2 ] {\displaystyle S_{\left\lbrack {\frac {1}{2}},1\right\rbrack }{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\end{bmatrix}}} = [ 1 4 ( P 0 + 2 P 1 + P 2 ) 1 2 ( P 1 + P 2 ) P 2 ] {\displaystyle ={\begin{bmatrix}{{\frac {1}{4}}(P_{0}+2P_{1}+P_{2})}\\{{\frac {1}{2}}(P_{1}+P_{2})}\\P_{2}\end{bmatrix}}}


Kubna Bezjeova kriva

Razmotrimo sad podelu krive na dva dela pravljenjem reza u tački α ( t ) = α ( t 0 ) , t , t 0 [ 0 , 1 ] {\displaystyle \alpha (t)=\alpha (t_{0}),t,t_{0}\in [0,1]} .

Prva kriva:

β 3 1 ( t ) = ( 1 , t , t 2 , t 3 ) M S [ 0 , t 0 ] ( P 0 , P 1 , P 2 , P 3 ) T {\displaystyle {\begin{aligned}\beta _{3}^{1}(t)&=(1,t,t^{2},t^{3})MS_{[0,t_{0}]}(P_{0},P_{1},P_{2},P_{3})^{T}\end{aligned}}} ,


gde je S [ 0 , t 0 ] {\displaystyle S_{[0,t_{0}]}} data sa:


S [ 0 , t 0 ] = [ 1 0 0 0 1 t 0 t 0 0 0 ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 0 ( 1 t 0 ) 2 3 t 0 ( 1 t 0 ) 2 3 t 0 2 ( 1 t 0 ) t 0 3 ] . {\displaystyle {\begin{aligned}S_{[0,t_{0}]}&={\begin{bmatrix}1&0&0&0\\{1-t_{0}}&t_{0}&0&0\\{(1-t_{0})^{2}}&{2t_{0}(1-t_{0})}&t_{0}^{2}&0\\{(1-t_{0})^{2}}&{3t_{0}(1-t_{0})^{2}}&{3t_{0}^{2}(1-t_{0})}&t_{0}^{3}\end{bmatrix}}.\end{aligned}}}


Temena kontrolnog poligona dobijamo iz:

S [ 0 , t 0 ] [ P 0 P 1 P 2 P 3 ] = [ 1 0 0 0 1 t 0 t 0 0 0 ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 0 ( 1 t 0 ) 2 3 t 0 ( 1 t 0 ) 2 3 t 0 2 ( 1 t 0 ) t 0 3 ] [ P 0 P 1 P 2 P 3 ] {\displaystyle S_{[0,t_{0}]}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}={\begin{bmatrix}1&0&0&0\\{1-t_{0}}&t_{0}&0&0\\{(1-t_{0})^{2}}&{2t_{0}(1-t_{0})}&t_{0}^{2}&0\\{(1-t_{0})^{2}}&{3t_{0}(1-t_{0})^{2}}&{3t_{0}^{2}(1-t_{0})}&t_{0}^{3}\end{bmatrix}}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}}


Za t 0 = 1 2 {\displaystyle t_{0}={\frac {1}{2}}} temena su data sa:


S [ 0 , 1 2 ] [ P 0 P 1 P 2 P 3 ] {\displaystyle S_{[0,{\frac {1}{2}}]}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}} = [ P 0 1 2 ( P 0 + P 1 ) 1 4 ( P 0 + 2 P 1 + P 2 ) 1 8 ( P 0 + 3 P 1 + 3 P 2 + P 3 ) ] {\displaystyle ={\begin{bmatrix}P_{0}\\{{\frac {1}{2}}(P_{0}+P_{1})}\\{{\frac {1}{4}}(P_{0}+2P_{1}+P_{2})}\\{{\frac {1}{8}}(P_{0}+3P_{1}+3P_{2}+P_{3})}\end{bmatrix}}}



Druga kriva β 3 2 ( t ) {\displaystyle \beta _{3}^{2}(t)} je definisana sa:


β 3 2 ( t ) = α ( t 0 + ( 1 t 0 ) t ) = ( 1 , t , t 2 , t 3 ) M S [ 1 t 0 , 1 ] ( P 0 , P 1 , P 2 , P 3 ) T {\displaystyle \beta _{3}^{2}(t)=\alpha (t_{0}+(1-t_{0})t)=(1,t,t^{2},t^{3})MS_{[1-t_{0},1]}(P_{0},P_{1},P_{2},P_{3})^{T}} ,


gde je:

S [ 1 t 0 , 1 ] = [ ( 1 t 0 ) 3 3 t 0 ( 1 t 0 ) 2 3 t 0 2 ( 1 t 0 ) t 0 3 0 ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 0 0 ( 1 t 0 ) t 0 0 0 0 1 ] {\displaystyle S_{[1-t_{0},1]}={\begin{bmatrix}{(1-t_{0})^{3}}&{-3t_{0}(1-t_{0})^{2}}&{3t_{0}^{2}(1-t_{0})}&{t_{0}^{3}}\\0&{(1-t_{0})^{2}}&{2t_{0}(1-t_{0})}&{t_{0}^{2}}\\0&0&(1-t_{0})&t_{0}\\0&0&0&1\end{bmatrix}}} .


Kontrolni poligon je određen sledećim tačkama:


S [ 1 t 0 , 1 ] [ P 0 P 1 P 2 P 3 ] = [ ( 1 t 0 ) 3 3 t 0 ( 1 t 0 ) 2 3 t 0 2 ( 1 t 0 ) t 0 3 0 ( 1 t 0 ) 2 2 t 0 ( 1 t 0 ) t 0 2 0 0 ( 1 t 0 ) t 0 0 0 0 1 ] [ P 0 P 1 P 2 P 3 ] {\displaystyle S_{[1-t_{0},1]}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}={\begin{bmatrix}{(1-t_{0})^{3}}&{-3t_{0}(1-t_{0})^{2}}&{3t_{0}^{2}(1-t_{0})}&{t_{0}^{3}}\\0&{(1-t_{0})^{2}}&{2t_{0}(1-t_{0})}&{t_{0}^{2}}\\0&0&(1-t_{0})&t_{0}\\0&0&0&1\end{bmatrix}}{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}}


tj. za t 0 = 1 2 {\displaystyle t_{0}={\frac {1}{2}}} :


S [ 1 2 , 1 ] [ P 0 P 1 P 2 P 3 ] {\displaystyle S_{\left\lbrack {\frac {1}{2}},1\right\rbrack }{\begin{bmatrix}P_{0}\\P_{1}\\P_{2}\\P_{3}\end{bmatrix}}} = [ 1 8 ( P 0 + 3 P 1 + 3 P 2 + P 3 ) 1 4 ( P 1 + 2 P 2 + P 3 ) 1 2 ( P 2 + P 3 ) P 3 ] {\displaystyle ={\begin{bmatrix}{{\frac {1}{8}}(P_{0}+3P_{1}+3P_{2}+P_{3})}\\{{\frac {1}{4}}(P_{1}+2P_{2}+P_{3})}\\{{\frac {1}{2}}(P_{2}+P_{3})}\\P_{3}\end{bmatrix}}}


De Kastelžoov algoritam

Ako želimo da odredimo tačku α ( t ) , t [ 0 , 1 ] {\displaystyle \alpha (t),t\in [0,1]} na krivoj, možemo jednostavno zameniti parametar u jednačinu krive. Ova metoda je numerički nestabilna i zato se koristi jednostavnija metoda: De Kastelžoov algoritam, čija je osnovna ideja u iterativnoj podeli kontrolnih duži u odnosu t : ( 1 t ) {\displaystyle t:(1-t)} .

Podela Bezjeove krive

Smisao podele krive je da je „isečemo“ u nekoj tački, tako da ona ostane podeljena na dva dela od kojih je svaki i dalje Bezjeova kriva. Početni skup kontrolnih tačaka se odbacuje, a rezultujuće Bezjeove krive se zadaju pomoću svojih novih kontrolnih tačkama.

Algoritam podele bazira se na De Kastelžoovom algoritmu.

Podela krive ima veliki broj primena: dizajn krivih, renderovanje Bezjeove krive, određivanje preseka dve krive... Ako imamo neku krivu koja nam ne odgovara, možemo je podeliti na nezadovoljavajući i zadovoljavajući deo i onda se skoncentrisati na promenu nezadovoljavajućeg dela.

Kriva se može deliti proizvoljan broj puta, a ako želimo da se podeoni preseci krive glatko spajaju, onda granične tačke i njihove dve susedne tačke moraju biti kolinearne.

Isto to važi ako želimo spojiti dve krive u jednu. Kako je crtanje krivih većeg stepena zahtevno, mogu se iskoristiti krive manjeg stepena i onda ih glatko povezivati.

Povećanje stepena krive

Računarstvo

Kodiranje[3]

Neki programski jezici omogućavaju crtanje Bezjeovih krivih ako su poznate kontrolne tačke kojima su određene.

Na primer, u html-u napravimo canvas tag:

 <canvas id="myCanvas" width="500" height="300"></canvas>

U okviru JavaScript-a definišemo canvas preko promenljivih:

 var c=document.getElementById("myCanvas");
 var ctx=c.getContext("2d");

Sada možemo koristiti sledeći kod koji iscrtava krivu stepena 3, gde P i x {\displaystyle P_{i}x} i P i y {\displaystyle P_{i}y} označavaju x {\displaystyle x} i y {\displaystyle y} koordinate i {\displaystyle i} -te tačke.

 ctx.beginPath();
 ctx.moveTo(<math>P_0x,P_0y</math>);
 ctx.bezierCurveTo(<math>P_1x,P_1y,P_2x,P_2y,P_3x,P_3y</math>);
 ctx.stroke();

Ako želimo krivu drugog stepena, potrebno je pozvati odgovarajuću funkciju, tj.:

 ctx.beginPath();
 ctx.moveTo(<math>P_0x,P_0y</math>);
 ctx.quadraticCurveTo(<math>P_1x,P_1y,P_2x,P_2y</math>);
 ctx.stroke();

Naredni kod je jednostavan i praktičan primer koji prikazuje kako se crta kubna Bezjeova kriva u programskom jeziku C. Ovaj algoritam je linearan jer je u praksi brži i lakši za implementaciju, za razliku od rekurzivnog De Kastelžoovog algoritma koji se često pominje u računarskoj grafici.

/******************************************************
  Kod za generisanje kubne Bezjeove krive
 *******************************************************/
 
  typedef struct
  {
 	float x;
 	float y;
  }
  Point2D;
 
 /******************************************************
  cp je niz koji sadrži 4 elementa gde:
  cp[0] je početna tačka
  cp[1] je prva kontrolna tačka
  cp[2] je druga kontrolna tačka
  cp[3] je krajnja tačka
 
  t je parametar, 0 <= t <= 1
 *******************************************************/
 
  Point2D PointOnCubicBezier( Point2D* cp, float t )
  {
 	float   ax, bx, cx;
 	float   ay, by, cy;
 	float   tSquared, tCubed;
 	Point2D result;
 	
 	/* računa koeficijente polinoma*/
 	
 	cx = 3.0 * (cp[1].x - cp[0].x);
 	bx = 3.0 * (cp[2].x - cp[1].x) - cx;
 	ax = cp[3].x - cp[0].x - cx - bx;
 	
 	cy = 3.0 * (cp[1].y - cp[0].y);
 	by = 3.0 * (cp[2].y - cp[1].y) - cy;
 	ay = cp[3].y - cp[0].y - cy - by;
 	
 	/* računa tačku krive u zavisnosti od parametra t */
 	
 	tSquared = t * t;
 	tCubed = tSquared * t;
 	
 	result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
 	result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
 	
 	return result;
  }
 
 /*****************************************************************************
  Argument funkcije ComputeBezier je niz struktura Point2D sa tačkama krive 
  generisanim uz pomoć kontrolnih tačaka cp. Pozivalac mora da obezbedi dovoljno
  memorije za rezultat čija je veličina <sizeof(Point2D) * brojTačaka>
 ******************************************************************************/
 
  void	ComputeBezier( Point2D* cp, int numberOfPoints, Point2D* curve )
  {
 	float dt;
 	int   i;
 	
 	dt = 1.0 / ( numberOfPoints - 1 );
 	
 	for( i = 0; i < numberOfPoints; i++ )
 		curve[i] = PointOnCubicBezier( cp, i*dt );
  }

Grafika

Bezjeove krive se naširoko koriste za modelovanje glatkih krivih. Afine transformacije kao što su translacija i rotacija mogu biti primenjene na kontrolne tačke krive.

Najčešće se koriste kvadratna i kubna kriva, jer krive većeg stepena troše mnogo više resursa računara daljom obradom. Kada su potrebni složeniji oblici, krive nižeg reda se spajaju i formiraju složenu Bezjeovu krivu, tzv. Bezjeov splajn. U jezicima vektorske grafike se složena Bezijerova kriva zove još i putanja. Kako bi se garantovala glatkoća krive, kontrolna tačka u kojoj se dve krive spajaju mora da bude na liniji između dve kontrolne tačke sa obe strane.

Standard za vektorsku grafiku naziva se SVG, a postoje programi za vektorsku grafiku: Adobe Illustrator, CorelDraw, Inkscape...

Najčešće korišćeni metod za rasterizovanje Bezjeove krive je rekurzivna podela, u kojoj se proveravaju kontrolne tačke, kako bi se otkrilo da li je kriva dovoljno glatka. U slučaju da nije, kriva se deli parametarski na dva segmenta i ista rekurzivna procedura se sprovodi nad oba dela.

Animacije

U Adobe Flash i Synfig animacijama, Bezijerove krive se koriste za konstruisanje. Recimo da korisnik želi da se njegov objekat kreće određenom putanjom. On će tu putanju zadati kao Bezjeovu krivu, a aplikacija će na osnovu unosa napraviti potrebne okvire po kojima će se objekat kretati.


Animacija Bezijerove krive u programskom jeziku Java
Animacija Bezjeove krive u programskom jeziku Python

Konstrukcija krivih

Linearne krive

Parametar t {\displaystyle t} kod linearne Bezjeove krive može biti protumačen kao „koliko je α ( t ) {\displaystyle \alpha (t)} daleko od P 0 {\displaystyle P_{0}} krećući se ka P 1 {\displaystyle P_{1}} . Na primer, kada je t = 0.5 {\displaystyle t=0.5} , α ( t ) {\displaystyle \alpha (t)} je na pola puta od P 0 {\displaystyle P_{0}} ka P 1 {\displaystyle P_{1}} . Promenom parametra t {\displaystyle t} od 0 do 1, ispisuje se prava linija.

Animacija linearne Bezjeove krive, t je iz [0,1]

Kvadratne krive

Dok parametar t {\displaystyle t} varira od 0 do 1, moguće je uočiti sledeće:

  • Tačku Q 0 ( t ) {\displaystyle Q_{0}(t)} koja varira od P 0 {\displaystyle P_{0}} do P 1 {\displaystyle P_{1}} i time ispisuje linearnu Bezjeovu krivu
  • Tačku Q 1 ( t ) {\displaystyle Q_{1}(t)} koja varira od P 1 {\displaystyle P_{1}} do P 2 {\displaystyle P_{2}} i time ispisuje linearnu Bezjeovu krivu
  • Tačku α ( t ) {\displaystyle \alpha (t)} koja je linearna interpolacija tačaka Q 0 {\displaystyle Q_{0}} i Q 1 {\displaystyle Q_{1}} i time ispisuje kvadratnu Bezjeovu krivu


Konstrukcija kvadratne Bezjeove krive
Animacija kvadratne Bezjeove krive, t je iz [0,1]


Krive višeg stepena

  • Kubna Bezjeova kriva ima tri tačke Q 0 , Q 1 , Q 2 {\displaystyle Q_{0},Q_{1},Q_{2}} koje ispisuju linearne krive i tačke R 0 , R 1 {\displaystyle R_{0},R_{1}} koje opisuju kvadratne Bezjeove krive.


Konstrukcija kubne Bezjeove krive
Animacija kubne Bezjeove krive, t je iz [0,1]
  • Kriva stepena četiri ima četiri tačke za opis linearnih krivih, tri tačke koje opisuju kvadratne krive i dve tačke koje opisuju kubne Bezjeove krive.


Konstrukcija Bezjeove krive stepena 4
Animacija Bezjeove krive stepena 4, t je iz [0,1]
  • Analogijom konstruišemo i krivu petog stepena, kao i krive većih stepena
Animacija Bezijerove krive petog stepena

Reference

  1. ^ Farin, Gerald E.; Hoschek, Josef; Myung-Soo Kim (2002). Handbook of Computer Aided Geometric Design. Elsevier. стр. 4—6. ISBN 978-0-444-51104-1. 
  2. ^ http://www.idav.ucdavis.edu/education/CAGDNotes/Matrix-Cubic-Bezier-Curve/Matrix-Cubic-Bezier-Curve.html Архивирано на сајту Wayback Machine (4. март 2016) Matrična reprezentacija, 29.01.2016.
  3. ^ http://codegolf.stackexchange.com/questions/21178/animated-drawing-of-a-b%C3%A9zier-curve Programerski kodovi, 29.01.2016.

Literatura

  • Farin, Gerald E.; Hoschek, Josef; Myung-Soo Kim (2002). Handbook of Computer Aided Geometric Design. Elsevier. стр. 4—6. ISBN 978-0-444-51104-1. 
  • Šukilović, T. Vukmirović, S. (2015). Geometrija za informatičare. Beograd, Matematički fakultet u Beogradu. стр. 139—149. ISBN 978-86-7589-106-2. CS1 одржавање: Вишеструка имена: списак аутора (веза)

Video snimci

  • Animacija Bezijerovih krivih
  • Animacija Bezijerovih krivih
  • Crtanje hobotnice pomoću Bezijerovih krivih
  • GeoGebra
  • Bezijerove krive u PowerPoint-u
  • OpenGL
  • Bezijerove krive u računarskoj grafici
  • JavaScript tutorial za Bezijerove krive
  • Splajnovi
  • Mali čas Bezijerovih krivih
  • Racionalne Bezijerove krive
  • Inkscape tutorial
  • Inkscape tutorial: nacrtati macu pomoću Bezijerovih krivih

Vidi još

Spoljašnje veze

Bezjeove krive на Викимедијиној остави.
  • Animacija Bezijerovih krivih
  • Bezijerove krive na WolframMathWorld-u
  • Od Bezijera do Bernštajna
  • Programerski kodovi
  • Programerski kodovi
  • Matrična reprezentacija Bezijerovih krivih
Нормативна контрола Уреди на Википодацима
Државне
  • Чешка
Остале
  • Енциклопедија Британика