Les Courbes de Bézier cubiques
Page 1 sur 1
Les Courbes de Bézier cubiques
- Code:
rem ============================================================================
rem Les Courbes de Bézier cubiques
rem Par Papydall le 30/03/2018
rem ============================================================================
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 ============================================================================
rem L’équation paramétrique de la courbe de bézier cubique est :
rem ______________________________________________________________________
rem | |
rem | x(t) = (1-t)³x0 + 3t(1-t)²x1 + 3t²(1-t)x2 + t³x3 pour 0 <= t <= 1 |
rem | y(t) = (1-t)³y0 + 3t(1-t)²y1 + 3t²(1-t)y2 + t³y3 pour 0 <= t <= 1 |
rem |______________________________________________________________________|
rem ============================================================================
' ------------------------------------------------------------------------------
' Les courbes de Bézier sont utilisées en conception graphique
' ------------------------------------------------------------------------------
rem ============================================================================
dim xc,yc,p
picture 10 : full_space 10 : 2d_target_is 10 : print_target_is 10 : color 10,0,0,0
font_color 10, 255,255,255 : 2d_pen_color 255,000,000 : font_bold 10
font_name 10,"arial" : font_size 10,14 : 2d_fill_off
xc = width_client(10)/2 : yc = height_client(10)/2 : p = 1000 : ' pause pour suivre le tracé
' Exemples des courbes de Bézier
caption 0,"Exemples des courbes de Bézier"
2d_pen_color 255,000,000 : Cubic_Bezier_Curve(120,20,20,100,200,100,320,20) : pause p : color 10,0,0,0
2d_pen_color 255,255,000 : Cubic_Bezier_Curve(300,200,200,100,400,200,350,100) : pause p : color 10,0,0,0
2d_pen_color 000,255,000 : Cubic_Bezier_Curve(100,400,200,200,300,400,550,220) : pause p : color 10,0,0,0
2d_pen_color 000,255,255 : Cubic_Bezier_Curve(100,350,500,50,80,50,400,250) : pause p : color 10,0,0,0
2d_pen_color 255,000,255 : Cubic_Bezier_Curve(100,400,200,200,400,220,450,350) : pause p : color 10,0,0,0
2d_pen_color 255,255,255 : Cubic_Bezier_Curve(114,165,208,444,360,165,114,165) : pause p : color 10,0,0,0
' Dessiner différentes figures avec les courbes de Bézier
caption 0,"Tracé d'une Soucoupe par les courbes de Bézier" : Soucoupe() : pause p
caption 0,"Tracé d'un Coeur par les courbes de Bézier" : Coeur() : pause p
caption 0,"Tracé d'une Fleur par les courbes de Bézier" : Fleur() : pause p
caption 0,"Tracé d'un Oeuf par les courbes de Bézier" : Oeuf() : pause p
caption 0,"Tracé d'une pièce d'un Puzzle par les courbes de Bézier" : Puzzle() : pause p
caption 0,"Tracé d'un vase par les courbes de Bézier" : Vase() : pause p
caption 0,"Tracé d'une voiture par les courbes de Bézier" : Voiture() : pause p
caption 0,"Tracé d'une bulle de dialogue par les courbes de Bézier" : Bulle_De_Dialogue() : pause p
caption 0,"Tracé de pacman par les courbes de Bézier" : Pacman() : pause p
2d_pen_color 255,255,0 : color 10,0,0,0 : font_color 10,200,100,20 : 2d_fill_off
caption 0,"Tracé d'un rectangle avec coins arrondis par les courbes de Bézier"
Rectangle_Arrondi(100,300,200,100,50)
print_target_is 10 : font_size 10,16 : print_locate 120,340 : print "That's All folks !!"
end
rem ============================================================================
rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
rem ============================================================================
' Fonction retournant le cube de son argument
FNC Cube(n)
result n*n*n
END_FNC
rem ============================================================================
' Fonction retournant le carré de son argument
FNC Carre(n)
result n*n
END_FNC
rem ============================================================================
' Dessiner un arc de cercle centré à la position (x, y), de rayon r, commençant
' à angleInitial (en degré) et finissant à angleFinal (en degré) en allant dans
' le sens indiqué par s (s = 0 : sens horaire ; s = 1 : sens trigonométrique).
SUB Arc(x,y,r,aInitial,aFinal,s)
dim_local a,a1,a2
degrees
if s > 0
a1 = aInitial : a2 = aFinal
else
a1 = aFinal : a2 = 360+aInitial
end_if
2d_poly_from x+r*cos(a1),y-r*sin(a1)
for a = a1 to a2
2d_poly_to x+r*cos(a),y-r*sin(a)
next a
END_SUB
rem ============================================================================
' Tracé d'une courbe de Bézier cubique (de degré 3)
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) : ' Tableau des coordonnées des points de la courbe
dim_local i,t,xp0,xp1,xp2,xp3,yp0,yp1,yp2,yp3
2d_poly_from x0,y0 : ' Point de départ du tracé
for i = 0 to np
t = i/np : ' t varie entre 0.0 et 1.0
xp0 = Cube(1-t)*x0 : yp0 = Cube(1-t)*y0
xp1 = 3*Carre(1-t)*t*x1 : yp1 = 3*Carre(1-t)*t*y1
xp2 = 3*(1-t)*Carre(t)*x2 : yp2 = 3*(1-t)*Carre(t)*y2
xp3 = Cube(t)*x3 : yp3 = Cube(t)*y3
bezier(i,0) = xp0 + xp1 + xp2 + xp3 : ' Coordonnées x(t)
bezier(i,1) = yp0 + yp1 + yp2 + yp3 : ' Coordonnées y(t)
2d_poly_to bezier(i,0),bezier(i,1) : ' Relier la courbe au point (x(t),y(t))
display
next i
' Activer la ligne suivante pour voir les points définissant la courbe
' 2d_circle x0,y0,2 : 2d_circle x1,y1,2 : 2d_circle x2,y2,2 : 2d_circle x3,y3,2
END_SUB
rem ============================================================================
' Dessiner une soucoupe avec les courbes de Bézier
SUB Soucoupe()
' Le bas de la soucoupe
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
' Le haut de la soucoupe
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 ============================================================================
SUB Coeur()
label dcoeur
dim_local x1,y1,x2,y2,x3,y3,x4,y4
dim_local i,p
p = 1000
2d_pen_color 255,0,0 : color 10,0,0,0
restore_label dcoeur
read x1 : read y1 : x1 = xc+x1 : y1 = yc+y1
for i = 1 to 4
read x2 : read y2 : read x3 : read y3 : read x4 : read y4
x2 = xc+x2 : y2 = yc+y2 : x3 = xc+x3 : y3 = yc+y3 : x4 = xc+x4 : y4 = yc+y4
Cubic_Bezier_Curve(x1,y1,x2,y2,x3,y3,x4,y4) : ' pause p
x1 = x4 : y1 = y4
next i
END_SUB
rem ============================================================================
SUB Fleur()
label dfleur
dim_local x1,y1,x2,y2,x3,y3,x4,y4
dim_local i
2d_pen_color 255,0,0 : color 10,0,0,0
restore_label dfleur
read x1 : read y1 : x1 = xc+x1 : y1 = yc+y1
for i = 1 to 12
read x2 : read y2 : read x3 : read y3 : read x4 : read y4
x2 = xc+x2 : y2 = yc+y2 : x3 = xc+x3 : y3 = yc+y3 : x4 = xc+x4 : y4 = yc+y4
Cubic_Bezier_Curve(x1,y1,x2,y2,x3,y3,x4,y4) :' pause p
x1 = x4 : y1 = y4
next i
END_SUB
rem ============================================================================
SUB Oeuf()
label dOeuf
dim_local x1,y1,x2,y2,x3,y3,x4,y4
dim_local i
2d_pen_color 255,0,0 : color 10,0,0,0
restore_label dOeuf
read x1 : read y1 : x1 = xc+x1 : y1 = yc+y1
for i = 1 to 4
read x2 : read y2 : read x3 : read y3 : read x4 : read y4
x2 = xc+x2 : y2 = yc+y2 : x3 = xc+x3 : y3 = yc+y3 : x4 = xc+x4 : y4 = yc+y4
Cubic_Bezier_Curve(x1,y1,x2,y2,x3,y3,x4,y4) : ' pause p
x1 = x4 : y1 = y4
next i
END_SUB
rem ============================================================================
SUB Puzzle()
label dPuzzle
dim_local x1,y1,x2,y2,x3,y3,x4,y4
dim_local i
2d_pen_color 255,0,0 : color 10,0,0,0
restore_label dPuzzle
read x1 : read y1 : x1 = xc+x1 : y1 = yc+y1
for i = 1 to 16
read x2 : read y2 : read x3 : read y3 : read x4 : read y4
x2 = xc+x2 : y2 = yc+y2 : x3 = xc+x3 : y3 = yc+y3 : x4 = xc+x4 : y4 = yc+y4
Cubic_Bezier_Curve(x1,y1,x2,y2,x3,y3,x4,y4) :' pause p
x1 = x4 : y1 = y4
next i
END_SUB
rem ============================================================================
SUB Vase()
label dVase
dim_local x1,y1,x2,y2,x3,y3,x4,y4
dim_local i
2d_pen_color 255,0,0 : color 10,0,0,0
restore_label dVase
read x1 : read y1 : x1 = xc+x1 : y1 = yc+y1
for i = 1 to 6
read x2 : read y2 : read x3 : read y3 : read x4 : read y4
x2 = xc+x2 : y2 = yc+y2 : x3 = xc+x3 : y3 = yc+y3 : x4 = xc+x4 : y4 = yc+y4
Cubic_Bezier_Curve(x1,y1,x2,y2,x3,y3,x4,y4) : ' pause p
x1 = x4 : y1 = y4
next i
END_SUB
rem ============================================================================
SUB Voiture()
label dVoiture
dim_local x1,y1,x2,y2,x3,y3,x4,y4
dim_local i
2d_pen_color 255,0,0 : color 10,0,0,0
restore_label dVoiture
read x1 : read y1 : x1 = xc+x1 : y1 = yc+y1
for i = 1 to 3
read x2 : read y2 : read x3 : read y3 : read x4 : read y4
x2 = xc+x2 : y2 = yc+y2 : x3 = xc+x3 : y3 = yc+y3 : x4 = xc+x4 : y4 = yc+y4
Cubic_Bezier_Curve(x1,y1,x2,y2,x3,y3,x4,y4) : ' pause p
x1 = x4 : y1 = y4
next i
END_SUB
rem ============================================================================
SUB Bulle_De_Dialogue()
2d_pen_color 255,0,0 : color 10,0,0,0 : 2d_fill_off : font_color 10,200,100,20
Cubic_Bezier_Curve(75,25,25,25,25,25,25,62)
Cubic_Bezier_Curve(25,62,25,100,25,100,50,100)
Cubic_Bezier_Curve(50,100,50,120,50,120,30,125)
Cubic_Bezier_Curve(30,125,60,120,60,120,65,100)
Cubic_Bezier_Curve(65,100,125,100,125,100,125,62)
Cubic_Bezier_Curve(125,62,125,25,125,25,75,25)
print_locate 50,50 : print "Salut !"
END_SUB
rem ============================================================================
' Tracer un rectangle avec coins arrondis
SUB Rectangle_Arrondi(x,y,largeur,hauteur,rayon)
2d_line x,y+rayon,x,y+hauteur-rayon
Cubic_Bezier_Curve(x,y+hauteur-rayon,x,y+hauteur,x,y+hauteur,x+rayon,y+hauteur)
2d_poly_to x+largeur-rayon,y+hauteur
Cubic_Bezier_Curve(x+largeur-rayon,y+hauteur,x+largeur,y+hauteur,x+largeur,y+hauteur,x+largeur,y+hauteur-rayon)
2d_poly_to x+largeur,y+rayon
Cubic_Bezier_Curve(x+largeur,y+rayon,x+largeur,y,x+largeur,y,x+largeur-rayon,y)
2d_poly_to x+rayon,y
Cubic_Bezier_Curve(x+rayon,y,x,y,x,y,x,y+rayon)
END_SUB
rem ============================================================================
SUB Pacman()
dim_local i
2d_pen_color 255,0,0 : color 10,0,0,0
Rectangle_Arrondi(12,12,150,150,15)
Rectangle_Arrondi(19,19,150,150, 9)
Rectangle_Arrondi(53,53,49,33,10)
Rectangle_Arrondi(53,119,49,16,6)
Rectangle_Arrondi(135,53,49,33,10)
Rectangle_Arrondi(135,119,25,49,10)
Arc(37,37,13,-180/7,180/7,0)
2d_poly_to 31,37 : 2d_poly_to 37+13*cos(180/7),37-13*sin(180/7)
2d_flood 29,37,255,0,0
2d_fill_color 255,0,0
for i = 0 to 7 : 2d_rectangle 51+i*16,35,55+i*16,39 : next i
for i = 0 to 5 : 2d_rectangle 115,51+i*16,119,55+i*16 : next i
for i = 0 to 7 : 2d_rectangle 51+i*16,99,55+i*16,103 : next i
2d_line 83,116,83,102
Cubic_Bezier_Curve(83,102,83,94,89,88,97,88)
Cubic_Bezier_Curve(97,88,105,88,111,94,111,102)
2d_poly_to 111,116 : 2d_poly_to 106,111 : 2d_poly_to 102,116
2d_poly_to 92,116 : 2d_poly_to 88,111 : 2d_poly_to 83,116
2d_flood 100,110,255,0,0
2d_pen_color 0,0,0 : 2d_fill_color 0,0,0
2d_circle 101,102,2 : 2d_circle 89,102,2
END_SUB
rem ============================================================================
' Coeur 12 points
dCoeur:
data 1, -70, 82,-162, 162, -82, 123, -1
data 97, 51, 51, 51, 0, 160, -51, 51
data -97, 51, -133,-1, -162, -82, -82, -162
data 1, -70
rem ============================================================================
' Fleur 36 points
dFleur:
data 2, 172,-252, -75,217, -41,-85, 150
data -183, -188,208, 75,-148, 88,-62, -255
data 144, 168,-172, 2,75, -252,38, 218
data -150, -85,189, -182,-75, 208,-88, -148
data 255, -62,-168, 144,-2, -172,252, 75
data -218, 38, 85, -150, 179, 192, -207, -76
data 148, -88, 62, 255, -143, -169, 172, -2
data -75, 252, -41, -217, 150, 85, -189, 182
data 75, -208, 88, 148, -255, 62, 169, -143
data 2, 172
rem ============================================================================
' Oeuf 12 points
dOeuf:
data 0, -150, 76, -151, 114, -101, 115, -26
data 114, 75, 56, 149, 0, 152, -56, 149
data -114, 75, -115, -26, -114, -101, -76, -151
data 0, -150
rem ============================================================================
' Puzzle 48 points
dPuzzle:
data 1, -68, 48, -70, 64, -92, 47, -151
data 45, -152, 149, -151, 149, -151, 151, -148
data 150, -57, 149, -40, 169, -39, 227, -79
data 235, 0, 227, 76, 160, 34, 149, 40
data 148, 43, 149, 150, 149, 149, 149, 148
data 37, 149, 39, 149, 36, 147, 89, 73
data 2, 60, -44, 66, -60, 80, -36, 150
data -39, 149, -150, 151, -149, 149, -151, 148
data -150, 36, -149, 35, -138, 41, -68, 58
data -62, -2, -73, -84, -144, -38, -149, -42
data -150, -43, -149, -150, -149, -149, -149, -148
data -43, -149, -43, -150, -44, -151, -77, -72
data 1, -68
rem ============================================================================
dvase:
data -20,-80, -10,-60, -10,-60, -20,-40
data -50, 20, -50, 20, -20, 80
data -20, 80, 20, 80, 20, 80
data 50, 20, 50, 20, 20,-40
data 10,-60, 10,-60, 20,-80
data 00,-80, 00,-80, -20,-80
rem ============================================================================
dVoiture:
data 40,100
data 40,75,50,75,90,70
data 95,60,95,60,95,50
data 180,40,180,70,190,100
rem ============================================================================
Sujets similaires
» Courbes de Bézier cubiques
» Courbes polaires
» Courbes en coordonnées polaires
» DES MATHS POUR L'ESTHETIQUE DES COURBES
» Traceur de courbes représentatives des fonctions y = f(x)
» Courbes polaires
» Courbes en coordonnées polaires
» DES MATHS POUR L'ESTHETIQUE DES COURBES
» Traceur de courbes représentatives des fonctions y = f(x)
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Lun 1 Jan - 0:25 par Papydall-Admin
» A ceux qui célèbre Noël, bonnes fêtes
Dim 24 Déc - 10:49 par Papydall-Admin
» Joyeux Noël et Bonne Année
Ven 8 Déc - 1:34 par Papydall-Admin
» Planets of the Solar System : Tilts and Spins
Lun 20 Mar - 15:43 par Papydall-Admin
» Bonne Année 2023
Sam 31 Déc - 1:39 par Papydall-Admin
» Fractals - Mandelbrot
Ven 21 Aoû - 22:51 par Papydall-Admin
» Convertisseur Décimal ---> Binaire, Octal, Hexadécimal, ...
Mer 21 Nov - 1:08 par Papydall-Admin
» Balises {USER...}
Lun 19 Nov - 22:12 par Papydall-Admin
» Useful Dog
Ven 6 Avr - 14:25 par Papydall-Admin