Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Animation de courbe de Bézier cubique | |
| | Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 1:47 | |
| Encore une animation. Essayez avec ou sans la ligne 63 - Code:
-
cls : ' Mettre le CLS en REM pour voir des belles images!
Voici le - Code:
-
rem ============================================================================ rem Animation de courbe de Bézier cubique rem Par Papydall rem ============================================================================
Init() CreateInitpoint() Anim()
end rem ============================================================================ SUB Init() dim row(4,2), bezier(101,2) dim p1,p2,p3,jp1,jp2,jp3,incp1,incp2,incp3,q1,q2,q3,jq1,jq2,jq3,incq1,incq2,incq3 p1 = 4 : p2 = 6 : p3 = 5 : jp1 = 0 : jp2 = 0 : jp3 = 0 incp1 = 0.3 : incp2 = 0.3 : incp3 = 0.3 q1 = 3 : q2 = 7 : q3 = 4 : jq1 = 0 : jq2 = 0 : jq3 = 0 incq1 = 0.3 : incq2 = 0.3 : incq3 = 0.3 width 0,800 : height 0,800: top 0,(screen_y - width(0))/2 : left 0,(screen_x -height(0))/2 picture 10 : full_space 10 : 2d_target_is 10 : hide 10 image 20 caption 0,"<CLICK> pour arrêter ........" END_SUB rem ============================================================================ ' D'abord nous créons 4 points de contrôle espacés également. ' Nous essayons de les mettre plus ou moins dans le même plan horizontal avec ' une compensation aléatoire du point initial. rem ============================================================================ SUB CreateInitpoint() row(0,0) = 300 : row(0,1) = 300 row(1,0) = 300 + (rnd(060)-30) : row(1,1) = 270 + (rnd(060)-30) row(2,0) = 300 + (rnd(100)-50) : row(2,1) = 110 + (rnd(100)-50) row(3,0) = 300 - (rnd(150)-75) : row(3,1) = 200 + (rnd(150)-75) END_SUB rem ============================================================================ SUB Anim() repeat CreateInterpolated() : ' Interpoler la courbe de Bézier DrawCircleOnPath() : ' Placer des cercles sur la courbe de Bézier JigglePoints() : ' Changer légèrement les 4 points initiaux image_recopy() : ' Pour un affichage sans clignotement until scancode <> 0 END_SUB rem ============================================================================ ' Interpoler la courbe ' Ici nous créons un ensemble à 100 éléments de points interpolés. ' Ceux-ci sont sur la courbe (spline) de Bézier SUB CreateInterpolated() dim_local i,ix,x1,x2,x3,x4,y1,y2,y3,y4 for i = 0 to 100 ix = i/100 x1 = (1-ix)*(1-ix)*(1-ix)*row(0,0) : y1 = (1-ix)*(1-ix)*(1-ix)*row(0,1) x2 = 3*(1-ix)*(1-ix)*ix*row(1,0) : y2 = 3*(1-ix)*(1-ix)*ix*row(1,1) x3 = 3*(1-ix)*ix*ix*row(2,0) : y3 = 3*(1-ix)*ix*ix*row(2,1) x4 = ix*ix*ix*row(3,0) : y4 = ix*ix*ix*row(3,1) bezier(i,0) = x1+x2+x3+x4 : bezier(i,1) = y1+y2+y3+y4 next i END_SUB rem ============================================================================ ' Créez les cercles de taille diminuante et le miroir ' Pour tous les points sur la courbe de Bézier définie par bezier(), SUB DrawCircleonPath() dim_local i, outer,inner,surf,surf2 cls : ' Mettre le CLS en REM pour voir des belles images! outer = 38 for i = 0 to 100 2d_fill_color 255,0,0 : 2d_pen_color 255,0,0 outer = outer - 0.34 : surf = 420 + (260-bezier(i,1)) if surf > 350 2d_circle bezier(i,0),420+(260-bezier(i,1)),outer 2d_circle 420+(260-bezier(i,0)),420+(260-bezier(i,1)),outer end_if if outer < 2 2d_fill_color 255,0,0 : 2d_pen_color 255,0,0 : inner = 1 else 2d_fill_color 164,164,164 2d_pen_color 164,164,164 : inner = outer -1 end_if if surf > 350 2d_circle bezier(i,0),420+(260-bezier(i,1)),outer 2d_circle 420+(260-bezier(i,0)),420+(260-bezier(i,1)),outer end_if next i outer = 38 for i = 0 to 100 2d_fill_color 255,0,0 : 2d_pen_color 255,0,0 outer = outer - 0.34 : surf2 = bezier(i,1) if surf2 < 350 2d_circle bezier(i,0),bezier(i,1),outer 2d_circle 420+(260-bezier(i,0)),bezier(i,1),outer end_if if outer < 2 2d_fill_color 255,0,0 : 2d_pen_color 255,0,0 : inner = 1 else 2d_fill_color 255,255,255 : 2d_pen_color 255,255,255 : inner = outer -1 end_if if surf2 < 350 2d_circle bezier(i,0),bezier(i,1),inner 2d_circle 420+(260-bezier(i,0)),bezier(i,1),inner end_if next i END_SUB rem ============================================================================ ' Compenser les points de contrôle pour donner une impression de mouvement SUB JigglePoints() row(0,0) = 300 : row(0,1) = 300 if jp1 > p1 then incp1 = -0.2 if jp1 < 0-p1 then incp1 = 0.2 if jp2 > p2 then incp2 = -0.2 if jp2 < 0-p2 then incp2 = 0.2 if jp3 > p3 then incp3 = -0.2 if jp3 < 0-p3 then incp3 = 0.2
jp1 = jp1 + incp1 : jp2 = jp2 + incp2 : jp3 = jp3 + incp3 / 2 if jq1 > q1 then incq1 = -0.2 if jq1 < 0-q1 then incq1 = 0.2 if jq2 > q2 then incq2 = -0.2 if jq2 < 0-q2 then incq2 = 0.2 if jq3 > q3 then incq3 = -0.2 if jq3 < 0-q3 then incq3 = 0.2
jq1 = jq1 + incq1 : jq2 = jq2 + incq2 : jq3 = jq3 + incq3 / 2 row(0,0) = row(0,0) - jp3 : row(0,1) = row(0,1) - jq3 row(1,0) = row(1,0) - jp1 : row(1,1) = row(1,1) - jq1 row(2,0) = row(2,0) - jp2 : row(2,1) = row(2,1) - jq2 row(3,0) = row(3,0) - jp3 : row(3,1) = row(3,1) - jq3 END_SUB rem ============================================================================ ' Merci à Silverman et Cosmos70 pour cette astuce SUB image_recopy() 2d_target_is 10 : 2d_image_copy 20,0,0,width(10),height(10) 2d_target_is 0 : 2d_image_paste 20,left(10),top(10) 2d_target_is 10 END_SUB rem ============================================================================
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 7:44 | |
| Jolie animation - je n'ai pas essayé en compilé mais ça doit être encore plus joli et fluide | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 14:02 | |
| Merci Papydall, je me suis bien amusé. Voila une version colorée de mon cru que j'appellerais "tête de chat" . - Code:
-
rem ============================================================================ rem Animation de courbe de Bézier cubique rem Par Papydall rem ============================================================================
Init() CreateInitpoint() Anim()
end rem ============================================================================ SUB Init() dim row(4,2), bezier(101,2) dim p1,p2,p3,jp1,jp2,jp3,incp1,incp2,incp3,q1,q2,q3,jq1,jq2,jq3,incq1,incq2,incq3 p1 = 0 : p2 = 10 : p3 = 5 jp1 = 1 : jp2 = 2 : jp3 = 5 incp1 = 0.9 : incp2 = 0.6 : incp3 = 0.1 q1 = 2 : q2 = 7 : q3 = 4 : jq1 = 0 : jq2 = 9 : jq3 = 6 incq1 = 0.3 : incq2 = 0.3 : incq3 = 0.3 width 0,700 : height 0,800: top 0,(screen_y - width(0))/2 ' full_space 0 left 0,(screen_x -height(0))/2 color 0,0,0,0 picture 10 : full_space 10 :color 10,0,0,0: 2d_target_is 10 : hide 10 image 20 caption 0,"<CLICK> pour arrêter ........" END_SUB rem ============================================================================ ' D'abord nous créons 4 points de contrôle espacés également. ' Nous essayons de les mettre plus ou moins dans le même plan horizontal avec ' une compensation aléatoire du point initial. rem ============================================================================ SUB CreateInitpoint() row(0,0) = 300 : row(0,1) = 300 row(1,0) = 300 + (rnd(060)-30) : row(1,1) = 270 + (rnd(060)-30) row(2,0) = 300 + (rnd(100)-50) : row(2,1) = 110 + (rnd(100)-50) row(3,0) = 300 - (rnd(150)-75) : row(3,1) = 200 + (rnd(150)-75) END_SUB rem ============================================================================ SUB Anim() repeat CreateInterpolated() : ' Interpoler la courbe de Bézier DrawCircleOnPath() : ' Placer des cercles sur la courbe de Bézier JigglePoints() : ' Changer légèrement les 4 points initiaux image_recopy() : ' Pour un affichage sans clignotement until scancode <> 0 END_SUB rem ============================================================================ ' Interpoler la courbe ' Ici nous créons un ensemble à 100 éléments de points interpolés. ' Ceux-ci sont sur la courbe (spline) de Bézier SUB CreateInterpolated() dim_local i,ix,x1,x2,x3,x4,y1,y2,y3,y4 for i = 0 to 100 ix = i/100 x1 = (1-ix)*(1-ix)*(1-ix)*row(0,0) : y1 = (1-ix)*(1-ix)*(1-ix)*row(0,1) x2 = 3*(1-ix)*(1-ix)*ix*row(1,0) : y2 = 3*(1-ix)*(1-ix)*ix*row(1,1) x3 = 3*(1-ix)*ix*ix*row(2,0) : y3 = 3*(1-ix)*ix*ix*row(2,1) x4 = ix*ix*ix*row(3,0) : y4 = ix*ix*ix*row(3,1) bezier(i,0) = x1+x2+x3+x4 : bezier(i,1) = y1+y2+y3+y4 next i END_SUB rem ============================================================================ ' Créez les cercles de taille diminuante et le miroir ' Pour tous les points sur la courbe de Bézier définie par bezier(), SUB DrawCircleonPath() dim_local i, outer,inner,surf,surf2,r,g,b ' cls : ' Mettre le CLS en REM pour voir des belles images! outer = 38 : r=10:g=10:b=10 for i = 0 to 100 r=r+2:g=g+2:b=b+2 2d_fill_color 255,0,0 : 2d_pen_color rnd(r),g,b outer = outer - 0.34 : surf = 420 + (260-bezier(i,1)) if surf > 350 2d_circle bezier(i,0),420+(260-bezier(i,1)),outer 2d_circle 420+(260-bezier(i,0)),420+(260-bezier(i,1)),outer end_if if outer < 2 2d_fill_color 255,0,0 : 2d_pen_color r,rnd(g),b: inner = 3 else 2d_fill_color rnd(30)+i,rnd(75)+i,rnd(150)+i 2d_pen_color rnd(30)+i,rnd(75)+i,rnd(150)+i : inner = outer -1 end_if if surf > 350 2d_circle bezier(i,0),420+(260-bezier(i,1)),outer 2d_circle 420+(260-bezier(i,0)),420+(260-bezier(i,1)),outer end_if next i outer = 38 : r=10:g=10:b=10 for i = 0 to 100 r=r+2:g=g+2:b=b+2 2d_fill_color 255,0,0 : 2d_pen_color rnd(30)+i,rnd(75)+i,rnd(150)+i outer = outer - 0.34 : surf2 = bezier(i,1) if surf2 < 350 2d_circle bezier(i,0),bezier(i,1),outer 2d_circle 420+(260-bezier(i,0)),bezier(i,1),outer end_if if outer < 2 2d_fill_color rnd(30)+i,rnd(75)+i,rnd(150)+i : 2d_pen_color rnd(r),g,b : inner = 3 else 2d_fill_color 60+i,150+i,155+i : 2d_pen_color r,g,rnd(b) : inner = outer -1 end_if if surf2 < 350 2d_circle bezier(i,0),bezier(i,1),inner 2d_circle 420+(260-bezier(i,0)),bezier(i,1),inner end_if next i END_SUB rem ============================================================================ ' Compenser les points de contrôle pour donner une impression de mouvement SUB JigglePoints() row(0,0) = 300 : row(0,1) = 300 if jp1 > p1 then incp1 = -0.2 if jp1 < 0-p1 then incp1 = 0.2 if jp2 > p2 then incp2 = -0.2 if jp2 < 0-p2 then incp2 = 0.2 if jp3 > p3 then incp3 = -0.2 if jp3 < 0-p3 then incp3 = 0.2
jp1 = jp1 + incp1 : jp2 = jp2 + incp2 : jp3 = jp3 + incp3 / 2 if jq1 > q1 then incq1 = -0.2 if jq1 < 0-q1 then incq1 = 0.2 if jq2 > q2 then incq2 = -0.2 if jq2 < 0-q2 then incq2 = 0.2 if jq3 > q3 then incq3 = -0.2 if jq3 < 0-q3 then incq3 = 0.2
jq1 = jq1 + incq1 : jq2 = jq2 + incq2 : jq3 = jq3 + incq3 / 2 row(0,0) = row(0,0) - jp3 : row(0,1) = row(0,1) - jq3 row(1,0) = row(1,0) - jp1 : row(1,1) = row(1,1) - jq1 row(2,0) = row(2,0) - jp2 : row(2,1) = row(2,1) - jq2 row(3,0) = row(3,0) - jp3 : row(3,1) = row(3,1) - jq3 END_SUB rem ============================================================================ ' Merci à Silverman et Cosmos70 pour cette astuce SUB image_recopy() 2d_target_is 10 : 2d_image_copy 20,0,0,width(10),height(10) 2d_target_is 0 : 2d_image_paste 20,left(10),top(10) 2d_target_is 10 END_SUB rem ============================================================================ A+
Dernière édition par Jean Claude le Mar 25 Aoû 2015 - 14:15, édité 1 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 14:10 | |
| - Citation :
- que japperais "tête de chat"
C'est pas plutôt les chiens qui jappent que les chats ? | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 14:16 | |
| - JL35 a écrit:
-
- Citation :
- que japperais "tête de chat"
C'est pas plutôt les chiens qui jappent que les chats ? Bien vu JL35, c'est corrigé. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 14:44 | |
| Moi, j’ai vu autre chose que chiot, chat, ou la cigale et la fourmi …. Mais, bon jappe qui peut ! si on veut.
Vive les courbes de béz(i)er! | |
| | | jpcr
Nombre de messages : 276 Age : 57 Localisation : Val de Marne (94) Date d'inscription : 06/05/2011
| Sujet: Re: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 22:16 | |
| bravo, c’est très joli !!! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Animation de courbe de Bézier cubique Mar 25 Aoû 2015 - 22:21 | |
| Merci jpcr | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Animation de courbe de Bézier cubique Mer 26 Aoû 2015 - 12:26 | |
| @Jean_Debord: C'est aussi typiquement le type de programme que tu pourrais adapter pour ton compilateur afin d'en apprécier les performances. Le visuel est déjà là, mais bien sûr, compilé, l'animation des images devrait être bien plus rapide. | |
| | | Contenu sponsorisé
| Sujet: Re: Animation de courbe de Bézier cubique | |
| |
| | | | Animation de courbe de Bézier cubique | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |