Privacy Policy Cookie Policy Terms and Conditions Curva Bézier - Wikipedia

Curva Bézier

Da Wikipedia, l'enciclopedia libera.

Nel campo matematico della analisi numerica una curva Bézier è un'importante curva parametrica usata nella computer grafica. Un metodo numericamente stabile per calcolare le curve Bézier è l'algoritmo di de Casteljau.

Una generalizzazione delle curve Bézier in tre dimensioni è chiamata superficie Bézier di cui il triangolo Bézier è uno specifico caso.

Indice

[modifica] Storia

Le curve Bézier furono largamente pubblicizzate nel 1962 dall'ingegnere Francese Pierre Bézier che le usò per disegnare le carrozzerie delle automobili. Le curve furono realizzate nel 1959 da Paul de Casteljau usando l'algoritmo di de Casteljau.
Bézier stabilì un modo di realizzare le curve che partiva da due punti e una linea vettoriale appunto, un sistema innovativo che permette ancora oggi agli operatori grafici di realizzare disegni curvilinei bellissimi e precisi. Le curve Bézier possono essere realizzate da molti programmi di grafica vettoriale come Corel Draw, Illustrator o FreeHand.

[modifica] Analisi dei casi

[modifica] Curve Bézier lineari

Dati i punti P0 e P1, una curva Bézier lineare è una linea retta che li attraversa. La curva è data da

\mathbf{B}(t)=(1-t)\mathbf{P}_0 + t\mathbf{P}_1 \mbox{ , } t \in [0,1].

[modifica] Curve Bézier quadratiche

Una curva Bézier quadratica è il percorso tracciato tramite la funzione B(t), dati i punti P0, P1, e P2,

\mathbf{B}(t) = (1 - t)^{2}\mathbf{P}_0 + 2t(1 - t)\mathbf{P}_1 + t^{2}\mathbf{P}_2 \mbox{ , } t \in [0,1].

I fonts TrueType usano le spline Bézier composte da curve Bézier quadratiche.

[modifica] Curve Bézier cubiche

I quattro punti P0, P1, P2 e P3 nel piano o in uno spazio tridimensionale definiscono una curva Bézier cubica. La curva ha inizio in P0 si dirige verso P1 e finisce in P3 arrivando dalla direzione di P2. In generale, essa non passa dai punti P1 o P2; questi punti sono necessari solo per dare alla curva informazioni direzionali. La distanza tra P0 e P1 determina quanto la curva si muove nella direzione di P2 prima di dirigersi verso P3.

La forma parametrica della curva è:

\mathbf{B}(t)=\mathbf{P}_0(1-t)^3+3\mathbf{P}_1t(1-t)^2+3\mathbf{P}_2t^2(1-t)+\mathbf{P}_3t^3 \mbox{ , } t \in [0,1].

I moderni sistemi di imaging come PostScript, METAFONT e GIMP usano le spline Bézier composte da curve Bézier cubiche per disegnare forme curve.

[modifica] Generalizzazione

La curva Bézier di grado n può essere generalizzata come segue. Dati i punti P0, P1,..., Pn, La curva Bézier è:

\mathbf{B}(t)=\sum_{i=0}^n {n\choose i}\mathbf{P_i}(1-t)^{n-i}t^i =\mathbf{P}_0(1-t)^n+{n\choose 1}\mathbf{P}_1(1-t)^{n-1}t+\cdots+\mathbf{P}_nt^n \mbox{ , } t \in [0,1].

Per esempio, per n = 5:

\mathbf{B}(t)=\mathbf{P}_0(1-t)^5+5\mathbf{P}_1t(1-t)^4+10\mathbf{P}_2t^2(1-t)^3+10\mathbf{P}_3t^3(1-t)^2+5\mathbf{P}_4t^4(1-t)+\mathbf{P}_5t^5 \mbox{ , } t \in [0,1].

[modifica] Terminologia

Un po' di terminologia è associata a queste curve parametriche. Abbiamo

\mathbf{B}(t)=\sum_{i=0}^n {n\choose i}\mathbf{P_i}(1-t)^{n-i}t^i,\quad t\in[0,1]

I polinomi

{n\choose i}(1-t)^{n-i}t^i

sono conosciuti come polinomi di base di Bernstein di grado n e sono definiti da

b_{i,n}(t):= {n \choose i} t^i (1-t)^{n-i},\qquad i=0,\ldots n.

definito 00 = 1.

I punti Pi sono chiamati punti di controllo per la curva Bézier. Il poligono formato connettendo i punti attraverso linee rette, iniziando da P0 e finendo con Pn è l'insieme convesso contentente i punti Pi . Questo poligono è chiamato poligono Bézier, ed esso contiene la curva Bézier.

[modifica] Note

  • La curva inizia in P0 e termina in Pn; questa è chiamata la proprietà della interpolazione di punto finale.
  • La curva è una linea retta se e solo se tutti i punti di controllo giacciono sulla curva, similmente, la curva Bézier è una linea retta se e solo se i punti di controllo sono collineari.
  • L'inizio (fine) della curva è tangente al primo (ultimo) lato del poligono Bézier.
  • Una curva può essere spezzata in qualsiasi punto in 2 sottocurve, o in un arbitrario numero di sottocurve, ognuna delle quali è essa stessa una curva Bézier.
  • Un cerchio non può essere esattamente formato da una curva Bézier, come neanche un arco di cerchio. Comunque una curva Bézier è un'adeguata approssimazione di un arco circolare abbastanza piccolo.

[modifica] Applicazioni nella computer grafica

Le curve Bézier sono largamente usate nella computer grafica per modellare curve smussate. Dato che la curva è contenuta completamente nell'insieme convesso dei suoi punti di controllo, i punti possono essere visualizzati graficamente ed usati per manipolare la curva intuitivamente. Trasformazioni geometriche come traslazione, omotetia e rotazione possono essere applicate alla curva applicando le rispettive trasformazioni sui punti di controllo della curva.

Le più importanti curve Bézier sono le quadratiche e cubiche. Curve di grado più alto sono molto più costose da valutare. Quando sia necessario realizzare forme più complesse, più curve di secondo o terzo ordine sono "incollate" insieme (obbedendo a certe condizioni di smooth) in forma di spline Bézier.

Il codice seguente è un semplice e pratico esempio che mostra come disegnare una curva Bézier cubica in C. Da notare che viene semplicemente calcolato il coefficiente del polinomio e si cicla su una serie di valori di t da 0 a 1 - in pratica questo è come viene effettivamente fatto, anche se esistono altri metodi come l'algoritmo di de Casteljau che sono spesso citati in discussioni sulla grafica. Questo perché in pratica un algoritmo lineare come questo è veloce e meno costoso di uno ricorsivo come quello di de Casteljau.


/******************************************************
 Codice per generare una curva Bézier cubica
 Attenzione - codice non testato
*******************************************************/

 typedef struct
 {
        float x;
        float y;
 }
 Point2D;

/******************************************************
 cp è un array di 4 elementi dove:
 cp[0] è il punto iniziale
 cp[1] è il primo punto di controllo
 cp[2] è il secondo punto di controllo
 cp[3] è il punto finale

 t è il valore del parametro, 0 <= t <= 1
*******************************************************/

 Point2D PointOnCubicBezier( Point2D* cp, float t )
 {
        float   ax, bx, cx;
        float   ay, by, cy;
        float   tSquared, tCubed;
        Point2D result;
        
        /* calcolo dei coefficienti del polinomio */
        
        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;
        
        /* calcolo del punto della curva in relazione a 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;
 }

/*****************************************************************************
 ComputeBezier riempe un array di strutture Point2D  con i punti della curva 
 generati dai punti di controllo cp. Il chiamante deve allocare memoria 
 sufficiente per il risultato che è <sizeof(Point2D) * numeroDiPunti>
******************************************************************************/

 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 );
 }

[modifica] Curve Bézier razionali

Alcune curve che sembrano semplici, come il cerchio, non possono essere descritte da una curva Bézier, quindi abbiamo bisogno di maggiori gradi di libertà.

La curva Bézier razionale aggiunge pesi che possono essere aggiustati. Il numeratore è una curva Bézier in forma di Bernstein pesata e il denominatore è una somma pesata di polinomi di Bernstein

Dati n+1 punti di controllo Pi, la curva Bézier razionale è data da:

\mathbf{B}(t) = \frac{ \sum_{i=0}^n b_{i,n}(t) \mathbf{P}_{i}w_i  } { \sum_{i=0}^n b_{i,n}(t) w_i  }

o semplicemente

\mathbf{B}(t) = \frac{ \sum_{i=0}^n {n \choose i} t^i (1-t)^{n-i}\mathbf{P}_{i}w_i  } { \sum_{i=0}^n {n \choose i} t^i (1-t)^{n-i}w_i  }.

[modifica] Voci correlate

[modifica] Riferimenti

[modifica] Collegamenti esterni

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu