HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Curve di Bézier-approfondimenti2  (Letto 2096 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
Curve di Bézier-approfondimenti2
« il: 29 Luglio 2013, 14:57 »
Approssimazione dell’arco di Bézier al cerchio

Molti programmi di grafica vettoriale non utilizzano effettivi archi di cerchio, ma piuttosto archi di Bézier simmetrici approssimati al cerchio.
Dato un raggio r, vogliamo costruire a tal fine un arco di Bézier che attraversa i punti:
(-r,0),   (r*sqr(2)/2,-r*sqr(2)/2),  (0,r)
che appartengono al quadrante inferiore destro di un cerchio centrato in O.

Formula di Bézier applicata agli estremi del quadrante:
x1=0
y1=-r   !punto iniziale
t1x=tg
t1y=0  !tangente su P. iniziale
x2=r
y2=0   !punto finale
t2x=0
t2y=-tg  !tangente su P. finale
x=(1-t)^3*x1+3*t*(1-t)^2*(t1x+x1)+3*t^2*(1-t)*(t2x+x2)+t^3*x2
y=(1-t)^3*y1+3*t*(1-t)^2*(t1y+y1)+3*t^2*(1-t)*(t2y+y2)+t^3*y2

Operando le sostituzioni diventa:
x=3*t*(1-t)^2*tg+3*t^2*(1-t)*r+t^3*r
y=(1-t)^3*(-r)+3*t*(1-t)^2*(-r)+3*t^2*(1-t)*(-tg)

Per ragioni di simmetria sul punto medio del quadrante di cerchio, tagliato dalla diagonale, il parametro t vale 1/2:
t=1/2
 r*sqr(2)/2=3/8*tg+3/8*r+1/8*r
-r*sqr(2)/2=1/8*(-r)+3/8*(-r)+3/8*(-tg)
per cui, affinché l'arco di Bézier passi per il centro del quadrante di circonferenza, deve risultare:
r*sqr(2)=3/4*tg+r
tg=4/3*r*(sqr(2)-1)
ovvero la tangente all’estremo del quadrante deve avere lunghezza, riferita al raggio, pari ai quattro terzi del valore ottenuto dalla radice di due meno uno, ovvero deve avere lunghezza pari ai quattro terzi la differenza tra la semidiagonale del quadrato inscrivente il cerchio ed il suo raggio.

In modo analogo si può ragionare per ricavare la formula per una curva di Bézier che approssima l’arco di cerchio di ampiezza angolare al:
x1=r
y1=0   !punto iniziale
t1x=0
t1y=tg  !tangente su P. iniziale
x2=r*cos(al)
y2=r*sin(al)   !punto finale
t2x= tg*sin(al)
t2y=-tg*cos(al)  !tangente su P. finale

x=(1-t)^3*x1+3*t*(1-t)^2*(t1x+x1)+3*t^2*(1-t)*(t2x+x2)+t^3*x2
y=(1-t)^3*y1+3*t*(1-t)^2*(t1y+y1)+3*t^2*(1-t)*(t2y+y2)+t^3*y2

Operando le sostituzioni diventa:
x=(1-t)^3*r+3*t*(1-t)^2*r+3*t^2*(1-t)*(tg*sin(al)+r*cos(al))+t^3*r*cos(al)
y=3*t*(1-t)^2*tg+3*t^2*(1-t)*(r*sin(al)-tg*cos(al))+t^3*r*sin(al)

Sempre per ragioni di simmetria sul punto mediano dell'arco di cerchio il parametro t vale ½.
Tale punto mediano, posto sulla bisettrice, ha coordinate:  (r*cos(al/2),r*sin(al/2)

t=1/2
r*cos(al/2)=1/8*r+3/8*r+3/8*(tg*sin(al)+r*cos(al))+1/8*r*cos(al)
r*sin(al/2)=3/8*tg+3/8*(r*sin(al)-tg*cos(al))+1/8*r*sin(al)

Per cui, affinchè l'arco di Bézier passi per il punto mediano dell’arco dato, deve essere:
r*cos(al/2)=1/2*r+3/8*tg*sin(al)+1/2*r*cos(al)
3/4*tg*sin(al)=r*(2*cos(al/2)-1-cos(al))
tg=4/3*r*(2*cos(al/2)-1-cos(al))/sin(al)
tg=4/3*r*(2*cos(al/2)-1-(cos(al/2)^2-sin(al/2)^2))/sin(al)
tg=4/3*r*(2*cos(al/2)-2*cos(al/2)^2)/(2*sin(al/2)*cos(al/2))
tg=4/3*r*(1-cos(al/2))/sin(al/2)

Per l’angolo piatto:
tg=4/3*r
ma in questo caso la curva risultante discosta dal semicerchio di una quantità abbastanza rilevante.

Notiamo che per al=90°  risulta:  cos(al/2)= sin(al/2)=sqr(2)/2 per cui si riottiene la formula precedente:
tg=4/3*r*(1- sqr(2)/2)/ sqr(2)/2=4/3*r*( sqr(2) - 1)

Più l’arco risulta stretto e più la curva di Bézier approssima meglio l’arco di cerchio. Per al=180 lo scostamento è abbastanza rilevante. Solitamente i programmi di grafica approssimano il cerchio con 4 curve di Bézier, cioè facendo riferimento al quadrato, ma in teoria ci si potrebbe riferire a qualsiasi poligono.