papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Les Courbes de Bézier cubiques Mar 1 Mar 2016 - 19:17 | |
| - Code:
-
rem ============================================================================ rem Les Courbes de Bézier cubiques rem REF : https://fr.wikipedia.org/wiki/Courbe_de_B%C3%A9zier rem ============================================================================ rem Une courbe de Bézier cubique est définie par quatres points P0, P1, P2 et P3 rem de coordonnées (x0,y0), (x1,y1), (x2,y2) et (x3,y3) rem P0 et P3 correspondent aux points des extrémités ou nœuds de la courbe. rem P1 et P2 correspondent aux points de contrôle ou poignées, chacun apparié rem avec l un des points terminaux. rem Les points de contrôle ont l utile propriété suivante : rem Une ligne commençant à une extrémité de la courbe et se terminant au point de rem contrôle correspondant est tangente à la courbe au point terminal. rem Ceci permet la jonction douce de multiples courbes de Bézier.
rem La courbe se trace en partant du point P0, en se dirigeant vers le point P1 rem et en arrivant au point P3 selon la direction P2-P3. rem La courbe ne passe pas nécessairement par P1 ni par P2. rem ============================================================================
' ------------------------------------------------------------------------------ ' Les courbes de Bézier sont utilisées en conception graphique ' ------------------------------------------------------------------------------ rem ============================================================================ ' Exemples des courbes de Bézier picture 10 : full_space 10 : 2d_target_is 10 : color 10,0,0,0
2d_pen_color 255,000,000 : Cubic_Bezier_Curve(120,20,20,100,200,100,320,20) : pause 1000 : color 10,0,0,0 2d_pen_color 255,255,000 : Cubic_Bezier_Curve(300,200,200,100,400,200,350,100) : pause 1000 : color 10,0,0,0 2d_pen_color 000,255,000 : Cubic_Bezier_Curve(100,400,200,200,300,400,550,220) : pause 1000 : color 10,0,0,0 2d_pen_color 000,255,255 : Cubic_Bezier_Curve(100,350,500,50,80,50,400,250) : pause 1000 : color 10,0,0,0 2d_pen_color 255,000,255 : Cubic_Bezier_Curve(100,400,200,200,400,220,450,350) : pause 1000 : color 10,0,0,0 2d_pen_color 255,255,255 : Cubic_Bezier_Curve(114,165,208,444,360,165,114,165) : pause 1000 : color 10,0,0,0
' Dessiner une soucoupe avec les courbes de Bézier Draw_Saucer() print_target_is 10 : font_size 10,16 : print_locate 100,400 : print "That's All folks !!"
end rem ============================================================================ rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& rem ============================================================================ ' Tracé d'une courbe de Bézier cubique SUB Cubic_Bezier_Curve(x0,y0,x1,y1,x2,y2,x3,y3) dim_local np : np = 100 : ' nombre de points interpolés sur la courbe, plus ce nombre est grand, plus la courbe sera lisse dim_local bezier(np,2) dim_local i,t,xp0,xp1,xp2,xp3,yp0,yp1,yp2,yp3 2d_poly_from x0,y0 for i = 0 to np t = i/np xp0 = (1-t)*(1-t)*(1-t)*x0 : yp0 = (1-t)*(1-t)*(1-t)*y0 xp1 = 3*(1-t)*(1-t)*t*x1 : yp1 = 3*(1-t)*(1-t)*t*y1 xp2 = 3*(1-t)*t*t*x2 : yp2 = 3*(1-t)*t*t*y2 xp3 = t*t*t*x3 : yp3 = t*t*t*y3 bezier(i,0) = xp0 + xp1 + xp2 + xp3 : bezier(i,1) = yp0 + yp1 + yp2 + yp3 2d_poly_to bezier(i,0),bezier(i,1) next i END_SUB rem ============================================================================ ' Comme exemple : ' Dessiner une soucoupe avec les courbes de Bézier SUB Draw_Saucer() dim_local p : p = 1000 : ' Pause pour visualiser les différentes courbes de Bézier ' Draw saucer bottom. 2d_pen_color 220,100,0 Cubic_Bezier_Curve(284,169,284,197,229,220,160,220) : pause p Cubic_Bezier_Curve(160,220,91,220,36,197,36,169) : pause p Cubic_Bezier_Curve(36,169,36,141,91,118,160,118) : pause p Cubic_Bezier_Curve(160,118,229,118,284,141,284,169) : pause p 2d_flood 220,200,220,100,0 ' Draw saucer top. 2d_pen_color 50,190,0 Cubic_Bezier_Curve(223,120,223,133,194,143,159,143) : pause p Cubic_Bezier_Curve(159,143,124, 143, 96, 133, 96, 120) : pause p Cubic_Bezier_Curve(96,129,96, 108, 124, 97, 159, 97) : pause p Cubic_Bezier_Curve(159,97,194, 97, 223, 108, 223, 120) : pause p 2d_flood 140,128,50,190,0 : 2d_flood 162,108,51,190,0 END_SUB rem ============================================================================
@Jean_DebordJe pense qu’une commande Cubic_Bezier_Curve(x0,y0,x1,y1,x2,y2,x3,y3) dans le langage FBPano sera fort utile, d’autant plus que son codage est simple. Qu’en penses-tu ? | |
|
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les Courbes de Bézier cubiques Jeu 3 Mar 2016 - 10:44 | |
| Voici donc une procédure en FBPano, pour intégration dans la bibliothèque polygones (qui va devoir changer de nom...) - Code:
-
sub Bezier_Cube (x0, y0, x1, y1, x2, y2, x3, y3, n%, x(), y()) dim i%, t, t2, t3, u, u2, u3, a, b
for i = 0 to n t = i / n t2 = t * t t3 = t2 * t u = 1 - t u2 = u * u u3 = u2 * u a = 3 * u2 * t b = 3 * u * t2 x(i) = u3 * x0 + a * x1 + b * x2 + t3 * x3 y(i) = u3 * y0 + a * y1 + b * y2 + t3 * y3 next i end_sub
Différences par rapport à la version PANORAMIC : - la procédure ne trace rien ; le programme appelant reçoit les coordonnées des points dans les tableaux x() et y() ; ensuite il trace ces points comme il veut - on utilise des variables intermédiaires pour réduire le nombre d'opérations à effectuer | |
|