Corbes de Bézier¶
Un tipus de corbes molt utilitzades en el disseny geomètric assistit per computador (CAGD) són les anomenades corbes de Bézier.
Les corbes que avui en dia es coneixen com corbes de Bézier van ser desenvolupades independentment per P. de Casteljau (l’any 1959, aproximadament) i per P. Bézier (l’any 1962). Bézier i De Casteljau van desenvolupar les seves teories com part de treballs de construcció de sistemes de CAD en dos companyies de cotxes franceses, Rénault i Citröen, respectivament.
Com que Rénault va publicar abans els resultats obtinguts, les corbes porten el nom de Bézier. Però l’algorisme que descriurem per avaluar aquestes corbes s’anomena algorisme de De Casteljau.
Suposem que tenim una seqüència finita de punts, que anomenarem punts de control, \(P_0, P_1, \ldots, P_n\). A partir d’aquests punts de control es defineix una corba parametritzada en l’interval \([0, 1]\), com segueix. Si \(t \in\) \([0, 1]\), es defineixen els punts:
\(P_i^r(t) = (1-t)P_i^{r-1} + t P_{i+1}^{r-1}\)
per \(r=1, \ldots, n\) i a més \(i=0, \ldots, n-r\)
entenent que \(P_i^0(t) =P_i\), punts de control donats. El punt de la corba de paràmetre \(t\) és, seguint la notació anterior, \(B(t) = P^n_0(t)\). La figura següent ho il.lustra:
Visiteu també aquest enllaç per acabar d’entendre el funcionament de l’algorisme de De Casteljau.
Deseu les funcions següents al fitxer bezier.py.
Dissenyeu la funció recursiva:
- bezier.punt_corba_Bezier(llista_punts, t)¶
A partir d’una llista de punts del pla
llista_punts(tuples amb dues coordenades), retorna el punt de la corba de Bézier definida pels punts de control de la llista (a la figura \(P_0, P_1, \ldots, P_n\)) avaluada ent. Podeu inspirar-vos en la definició recursiva de la corba.La funció hauria de passar els doctest següents, que podeu trobar al fitxer
bezier-1.txt:>>> import bezier >>> l1=[(0.0,0.0)] >>> q=bezier.punt_corba_Bezier(l1, 0.5) >>> print('{:5.3f}'.format(q[0])) 0.000 >>> print('{:5.3f}'.format(q[1])) 0.000 >>> l1=[(0.0, 0.0), (2, 3.0), (4.5, 9.0), (0.0, 12.0)] >>> q=bezier.punt_corba_Bezier(l1, 0.5) >>> print('{:5.3f}'.format(q[0])) 2.438 >>> print('{:5.3f}'.format(q[1])) 6.000 >>> q=bezier.punt_corba_Bezier(l1, 0.75) >>> print('{:5.3f}'.format(q[0])) 2.180 >>> print('{:5.3f}'.format(q[1])) 9.281
Dissenyeu la funció:
- bezier.mostreja_Bezier(pcontrol, nmostres)¶
Mostreja la corba de Bézier definida pels punts de control donats amb
nmostres(suposem quenmostresés més gran que dos) equiespaiades en l’interval [0,1] i retorna una llista amb els punts de mostreig (ordenats segons el paràmetre de la corba). Desa la funció en el fitxerbezier.py. Podeu trobar el següents jocs de proves al fitxerbezier-2.txt,>>> import bezier >>> def arrodonir_punt(p, n): ... return round(p[0], n), round(p[1], n) >>> l1=[(0.0, 0.0), (2.0, 3.0), (4.5, 9.0), (0.0, 12.0)] >>> lnova = bezier.mostreja_Bezier (l1, 10) >>> arrodonir_punt(lnova[0], 3) (0.0, 0.0) >>> arrodonir_punt(lnova[1], 3) (0.608, 0.984) >>> arrodonir_punt(lnova[2], 3)
Utilitzeu el pylab/matplotlib per dibuixar la corba, juntament amb els punts de control. Practiqueu primer amb aquest exemple:
>>> import pylab >>> punts = [ (0,0), (10,-1), (13,5), (-7,8), (2,2) ] >>> x, y = list(zip(*punts)) >>> pylab.plot(x, y) [<matplotlib.lines.Line2D object at 0x2acc910>] >>> pylab.show()
Engegueu l’interpret i proveu de pintar una corba de Bézier mostrejada convenientment. Tot seguit, pinteu també els punts de control (usueu els paràmetres d’estil opcionals de plot per dibuixar els marcadors, la llegenda, etc.)
Disposeu dels jocs de prova al fitxer
bezier-3.txt.
Solució
Disposeu d’una solució al fitxer bezier.py.