Računarska grafika

Bezjeove krive

Bezjeove krive (Bézier curves)

🚗 Nazvane po Pjeru Bezjeu (Pierre Bézier) koji ih je koristio 1960-tih za dizajn Renoovih automobila.

🚙 Međutim, razvio ih je Pol de Kastelžo (Paul de Casteljau) nekoliko godina ranije, radeći za Citroen.

Primene

  • Grafički dizajn
  • 3D modeliranje
  • Fontovi
  • Putanje u animaciji
  • Animacione krive

Parametarska kriva

Funkcija p(t)p(t)

  • p:RR2p : \mathbb{R} \rightarrow \mathbb{R}^2
  • Neprekidna

Ograničavamo se na
t[0,1]t \in [0,1]

Radi kraćeg zapisa: s=1ts = 1-t.

Linearna Bezjeova kriva

h:300

BP0P1(t)=sP0+tP1B_{P_0P_1}(t) = sP_0 + tP_1

Duž između tačaka P0P_0 i P1P_1.

Kvadratna Bezjeova kriva

h:300

BP0P1P2(t)=sBP0P1(t)+tBP1P2(t)B_{P_0P_1P_2}(t) = sB_{P_0P_1}(t) + tB_{P_1P_2}(t)
BP0P1P2(t)=s(sP0+tP1)+t(sP1+tP2)\phantom{B_{P_0P_1P_2}(t)} = s(sP_0 + tP_1) + t(sP_1 + tP_2)
BP0P1P2(t)=s2P0+2stP1+t2P2\phantom{B_{P_0P_1P_2}(t)} = s^2P_0 + 2stP_1 + t^2P_2

Deo parabole između tačaka P0P_0 i P2P_2.

💻 Bezier2_Quadratic

Kubna Bezjeova kriva

h:300w:403

BP0P1P2P3(t)=sBP0P1P2(t)+tBP1P2P3(t)B_{P_0P_1P_2P_3}(t) = sB_{P_0P_1P_2}(t) + tB_{P_1P_2P_3}(t)
BP0P1P2P3(t)=s(s2P0+2stP1+t2P2)+t(s2P1+2stP2+t2P3)\phantom{B_{P_0P_1P_2P_3}(t)} = s(s^2P_0 + 2stP_1 + t^2P_2) + t(s^2P_1 + 2stP_2 + t^2P_3)
BP0P1P2P3(t)=s3P0+3s2tP1+3st2P2+t3P3\phantom{B_{P_0P_1P_2P_3}(t)} = s^3P_0 + 3s^2tP_1 + 3st^2P_2 + t^3P_3

💻 Bezier3_Cubic

Bezjeova kriva nn-tog reda

BP0(t)=P0B_{P_0}(t) = P_0
BP0Pn(t)=sBP0Pn1(t)+tBP1Pn(t)B_{P_0 \ldots P_n}(t) = sB_{P_0 \ldots P_{n-1}}(t) + tB_{P_1 \ldots P_n}(t)
BP0Pn=i=0n(ni)snitiPiB_{P_0 \ldots P_n} = \sum_{i=0}^n{{n \choose i}s^{n-i}t^iP_i}

Osobine:

  • Počinje u P0P_0 i završava se u PnP_n.
  • P0P1P_0P_1 je tangenta na početak, a Pn1PnP_{n-1}P_n na kraj krive.
  • Prava linija akko su P0,,PnP_0, \ldots, P_n kolinearne.
  • Svaka Bezjeova kriva reda nn je takođe Bezjeova kriva reda mm, za svako m>nm > n.
  • Neke jednostavne krive se ne mogu prikazati kao Bezjeove krive, npr. kružnica!

Složene Bezjeove krive

(polybezier)

Kriva koja se sastoji od više Bezjeovih krivi, tako da je kraj jedne početak sledeće.

"Glatka" je ako je svaka krajnja tačka kolinearna sa njoj dve susedne kontrolne tačke.

Putanje (klasa View)

beginPath()
Započinje kreiranje nove putanje.

moveTo(p)
Postavlja trenutnu poziciju na p, bez dodavanja novih delova putanje.

lineTo(p)
Dodaje duž od trenutne pozicije ka p. Nova trenutna pozicija je p.

quadraticCurveTo(c, p)
Dodaje kvadratnu Bezjeovu krivu od trenutne pozicije do pozicije p, koristeći kontrolnu tačku c. Nova trenutna pozicija je p.

bezierCurveTo(c1, c2, p)
Dodaje kubnu Bezjeovu krivu od trenutne pozicije do pozicije p, koristeći kontrolne tačke c1 i c2. Nova trenutna pozicija je p.

Putanje (klasa View)

closePath()
Zatvara putanju, dodavajući duž koja spaja trenutnu poziciju sa početnom pozicijom.

stroke()
Iscrtava liniju po aktivnoj putanji.

fill()
Ispunjava površinu oivičenu aktivnom putanjom.

I prvi i drugi izvod su kontinualani ako važi prethodno, uz to da su rastojanja do dve susedne kontrolne tačake jednake. Ovo sam "proverio" računski, deluje ok.