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 |
|
|
| Les routines Tortue | |
|
+4Nardo26 Klaus Jicehel papydall 8 participants | |
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: Les routines Tortue Ven 26 Juin 2015 - 13:53 | |
| Vous avez peut-être connu le langage LOGO où il est question de sa célèbre tortue ? Certains langages possèdent aussi des routines tortue pour dessiner diverses figures géométriques / artistiques. La tortue possède un crayon qui peut être baissé (les déplacements de la tortue laissent des traces) ou levé (la tortue ne laisse pas de traces lors de ses déplacements). La tortue connaît comment exécuter des ordres du genre AVANCE(pas), RECULE(pas), GAUCHE(angle), DROITE(angle) et beaucoup d’autres commandes. Ça permet d’obtenir des belles figures très facilement. J’ai codé (en Panoramic) les routines tortue qui vous permettront de découvrir vos talents d’artiste ! Ce sont des procédures rassemblées dans un fichier Include_Turtle.bas que vous pouvez inclure dans vos programmes. Bonus : les angles que vous utilisez sont en degré (plus intuitif pour certains que les Radians!) Un programme type qui exploite les routines de Include_Turtle.bas a la structure suivante : - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici
end : ' fin de votre programme rem ============================================================================ ' Vos procédures ici ' ' ' Fin de vos procédures rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
Exemple pour tracer un rectangle de longueur LONG et de largeur LARG - Code:
-
SUB Rectangle(long,larg) dim_local i for i = 1 to 2 : AV(larg) : TD(90) : AV(long) : TD(90) : next i END_SUB
Appel : Rectangle(200,100) < ---------- tracer un rectangle à partir de la position actuelle de la tortue. Si on veut que notre rectangle soit tracé en oblique et non à l’horizontale (c’est un peut laborieux à faire sans passer par les routines tortue), il suffit de changer tout d’abord le cap de la tortue et appeler ensuite la procédure Rectangle. - Code:
-
SUB Rectangle_Oblique(ang,long,larg) Cap(ang) : Rectangle(long,larg) END_SUB
Appel : Rectangle_Oblique(45,300,100) < ---------- tracer un rectangle oblique(45° avec l’horizontale, de 300pixels /sur 200 pixels) à partir de la position actuelle de la tortue. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 13:57 | |
| Maintenant, voici le fichier Include_Turtle.bas. Le code est suffisamment documenté (lignes REM). Les ordres/commandes donnés à la tortue ont trois syntaxes : en français, en abrégé et en anglais. Par exemple : la commande qui fait avancer la tortue de pas pixels peut se coder : AVANCE(pas) < ----- en français AV(pas) en abrégé FORWARD(pas) en anglais Ces trois syntaxes produisent toutes le même résultat. - Code:
-
rem ============================================================================ rem Include_Turtle.bas rem Auteur : Papydall rem ============================================================================
rem ############################################################################ rem ============================================================================ rem LES PROCEDURES DE LA TORTUE rem ============================================================================ rem ############################################################################ rem Les variables globales Turtle_XXX sont prédéfinies pour les routines TORTUE. rem Votre programme ne doit ni les redéfinir ni les modifier. rem Ce sont : rem Turtle_Xorigine,Turtle_Yorigine : coordonnées de l origine (le centre de l écran) rem Turtle_X,Turtle_Y : coordonnées relatives de la tortue (par rapport à l origine) rem Turtle_Heading : direction initiale du déplacement de la tortue : vers le haut rem Turtle_PI : la constante Pi rem Turtle_rad : multiplicateur pour transformer les degrés en radians rem ============================================================================ rem REMARQUE IMPORTANTE : rem L origine des axes est le centre de la fenêtre rem Le sens positif sur l axe des X est dirigé vers la droite (négatif vers la gauche) rem Le sens positif sur l axe des Y est dirigé vers le haut (négatif vers le bas) rem ============================================================================ ' Initialisation de la tortue graphique ' La tortue se trouve au centre de la fénêtre et est dirigée vers le Nord (cap 0) SUB Init_Turtle() dim Turtle_Xorigine,Turtle_Yorigine :' coordonnées de l'origine (le centre de l'écran) dim Turtle_X,Turtle_Y : ' coordonnées relatives de la tortue (par rapport à l'origine) dim Turtle_Heading : ' direction initiale du déplacement de la tortue vers le haut dim New_Turtle_Heading: ' Nouveau cap de la tortue dim Turtle_PI : ' la constante Pi dim Turtle_rad : ' multiplicateur pour transformer les degrés en radians dim Turtle_PR, Turtle_PG, Turtle_PB : ' RGB du tracé dim Turtle_FR, Turtle_FG, Turtle_FB : ' RGB du fond dim Turtle_Flood_R, Turtle_Flood_G, Turtle_Flood_B : ' RGB du remplissage dim Turtle_R, Turtle_G,Turtle_B : ' RGB dim Turtle_Pen_Up_Down : ' Etat du crayon (0 = baissé) ; (1 = levé) dim Turtle_Return_value : ' Valeur de retour d'une SUB exploitée comme une fonction ' ------------------------------------------------------------------------------ full_space 0 : ' Utiliser tout l'écran Turtle_Pen_Up_Down = 0 : ' crayon baissé au départ Turtle_Xorigine = width(0)/2 : ' L'origine de ... Turtle_Yorigine = height(0)/2-20 : ' ... l'écran graphique Turtle_PI = acos(-1) : ' pi Turtle_Heading = Turtle_PI/2 : ' La tortue est dirigée vers le haut Turtle_rad = Turtle_PI/180 : ' Facteur multiplicateur pour les angles (degrés --> radians)
Nouveau() : ' Pour débuter un nouveau dessin END_SUB rem ============================================================================ rem ============================================================================ ' Pour débuter un nouveau dessin ' Effacer l'écran et remettre la tortue à sa place ' (au centre de la fenêtre et dirigée vers le nord) SUB Nouveau() cls : Origine() END_SUB rem ============================================================================ ' Ramener la tortue à l'origine (c-à-d au centre de la fenêtre) ' Ce qui est déjà tracé n'est pas effacé. SUB Origine() CouleurCrayon(255,255,255) : ' Tracé en blanc CouleurFond(0,0,0) : ' Fond noir Turtle_X = Turtle_Xorigine : Turtle_Y = Turtle_Yorigine 2d_poly_from Turtle_X,Turtle_Y New_Turtle_Heading = Turtle_Heading END_SUB rem ============================================================================ ' Avancer de pas pixels ' Si le crayon est baissé (Pen_Down), la tortue trace un trait avec la couleur en cours ' Si le crayon est levé (Pen_Up), la tortue se déplace sans laisser de trace SUB Avance(pas) dim_local x1,y1,x2,y2,a x1 = Turtle_X : y1 = Turtle_Y : a = New_Turtle_Heading x2 = Turtle_X + pas * cos(a) : y2 = Turtle_Y - pas * sin(a)
if Turtle_Pen_Up_Down = 0 : ' crayon baissé ? 2d_poly_to x2,y2 : ' on trace le trait avec la couleur en cours else : ' crayon levé 2d_poly_from x2,y2 : ' on se déplace sans trace end_if Turtle_X = x2 : Turtle_Y = y2 : ' Mise à jour des variables
END_SUB rem ============================================================================ ' Réculer de pas pixels ' Si le crayon est baissé (Pen_Down), la tortue trace un trait avec la couleur en cours ' Si le crayon est levé (Pen_Up), la tortue se déplace sans laisser de trace SUB Recule(pas) Avance(0-pas) END_SUB rem ============================================================================ ' Tourner à gauche (sens trigonométrique) de a degrés SUB Gauche(a) New_Turtle_Heading = New_Turtle_Heading + a * Turtle_rad END_SUB rem ============================================================================ ' Tourner à droite (sens horaire) de a degrés SUB Droite(a) New_Turtle_Heading = New_Turtle_Heading - a * Turtle_rad END_SUB rem ============================================================================ ' Fixer le Cap de la tortue de manière absolue selon l'angle de a degrés ' Le Cap est la direction du déplacement de la tortue :
' 0 c'est vers le haut (NORD) ' 90 c'est vers la droite (EST) ' 180 c'est vers le bas (SUD) ' 270 c'est vers la gauche (OUEST) ' 360 c'est identique à 000 SUB Cap(a) New_Turtle_Heading = Turtle_Heading + a * Turtle_rad END_SUB rem ============================================================================ ' Fixer la position X de la tortue par rapport à l'origine ' Déplacement horizontal SUB Pos_X(n) Turtle_X = Turtle_Xorigine + n : 2d_poly_from Turtle_X,Turtle_Y END_SUB rem ============================================================================ ' Fixer la position Y de la tortue par rapport à l'origine ' Déplacement vertical rem ############################################################################ rem REMARQUE IMPORTANTE : le sens posif pour les Y est le sens vers le haut rem ############################################################################ SUB Pos_Y(n) Turtle_Y = Turtle_Yorigine - n : 2d_poly_from Turtle_X,Turtle_Y END_SUB rem ============================================================================ ' Fixer la position de la tortue ' Déplacer la tortue au point (X,Y) par rapport au centre de la ' fenêtre qui est l'origine. ' X et/ou Y peuvent être positives, négatives ou nules SUB Position_XY(x,y) Turtle_X = Turtle_Xorigine + x : Turtle_Y = Turtle_Yorigine - y 2d_poly_from Turtle_X,Turtle_Y END_SUB rem ============================================================================ ' Tracer l'axe des X SUB DrawAxisX() 2d_line 0,Turtle_Yorigine,2*Turtle_Xorigine,Turtle_Yorigine END_SUB rem ============================================================================ ' Tracer l'axe des Y SUB DrawAxisY() 2d_line Turtle_Xorigine,0,Turtle_Xorigine,2*Turtle_Yorigine END_SUB rem ============================================================================ ' Tracer les 2 axes X et Y SUB DrawAxis() DrawAxisX() : DrawAxisY() END_SUB rem ============================================================================ ' On modifie l'état du crayon ' Lever le stylo : le déplacement de la tortue ne laisse pas de trace SUB LeveCrayon() Turtle_Pen_Up_Down = 1 END_SUB rem ============================================================================ ' On modifie l'état du crayon ' Baisser le stylo : le déplacement de la tortue laisse une trace SUB BaisseCrayon() Turtle_Pen_Up_Down = 0 END_SUB rem ============================================================================ ' Fixer la couleur du tracé SUB CouleurCrayon(r,g,b) Turtle_PR = R : Turtle_PG = G :Turtle_PB = B 2d_pen_color Turtle_PR, Turtle_PG, Turtle_PB END_SUB rem ============================================================================ ' Fixer la couleur du fond SUB CouleurFond(r,g,b) Turtle_FR = R : Turtle_FG = G : Turtle_FB = B color 0, Turtle_FR, Turtle_FG, Turtle_FB END_SUB rem ============================================================================ ' Gomme : La tortue efface tous les traits qu’elle rencontre SUB Gomme() 2d_pen_color Turtle_FR, Turtle_FG, Turtle_FB END_SUB rem ============================================================================ ' Inverser la couleur du crayon SUB InverseCrayon() 2d_pen_color 255 - Turtle_PR, 255 - Turtle_PG, 255 - Turtle_PB END_SUB rem ============================================================================ ' Remplissage de la zone où se trouve la tortue avec la couleur transmise en ' paramètres r,g,b SUB Colorie(r,g,b) Turtle_Flood_R = R : Turtle_Flood_G = G : Turtle_Flood_B = B 2d_flood Turtle_X, Turtle_Y, Turtle_Flood_R, Turtle_Flood_G, Turtle_Flood_B END_SUB rem ============================================================================ ' Tracer un cercle de rayon r centré à la position de la tortue SUB Disque(r) 2D_FILL_OFF : 2d_circle Turtle_X,Turtle_Y,r END_SUB rem ============================================================================ ' Tracer une ellipse de demi-axes Rx et Ry centrée à la position de la tortue SUB Ovale(Rx,Ry) dim_local i,x,y 2d_poly_from Turtle_X + Rx, Turtle_Y for i = 0 to 360 x = Turtle_X + Rx*cos(i*Turtle_Rad) : y = Turtle_Y + Ry*sin(i*Turtle_Rad) 2d_poly_to x,y next i END_SUB rem ============================================================================ ' Le cercle orthoptique de l'ellipse est l'ensemble des points qui "regardent" ' l'ellipse suivant un angle droit, c-à-d dont partent deux tagentes à l'ellipse ' perpendiculaires. ' Ce cercle a le même centre que l'ellipse et son rayon vaut sqr(Rx*Rx + Ry*Ry) SUB Cercle_Orthoptique(Rx,Ry) dim_local r r = sqr(Rx*Rx + Ry*Ry) 2D_FILL_OFF : 2d_circle Turtle_X,Turtle_Y,r END_SUB rem ============================================================================ ' Calculer la distance entre le centre de l'ellipse et l'un de ses foyers SUB Distance_Centre_Ellipse_O_Foyer(Rx,Ry) Turtle_Return_value = sqr(abs(Rx*Rx - Ry*Ry)) END_SUB rem ============================================================================ ' Calculer l'excentricité de l'ellipse. ' L'exentricité de l'ellipse exprime l'écart de forme entre l'ellipse et le ' cercle parfait dont l'excentricité est nulle. SUB Excentricite_Ellipse(Rx,Ry) dim_local c,e Distance_Centre_Ellipse_O_Foyer(Rx,Ry) : c = Turtle_Return_value : e = c/Rx Turtle_Return_value = e END_SUB rem ============================================================================ rem ############################################################################ ' Routines en abrégé rem ============================================================================ SUB AV(pas) Avance(pas) END_SUB rem ============================================================================ SUB RE(pas) Recule(pas) END_SUB rem ============================================================================ SUB TG(a) Gauche(a) END_SUB rem ============================================================================ SUB TD(a) Droite(a) END_SUB rem ============================================================================ SUB LC() LeveCrayon() END_SUB rem ============================================================================ SUB BC() BaisseCrayon() END_SUB rem ============================================================================ SUB CC(r,g,b) CouleurCrayon(r,g,b) END_SUB rem ============================================================================ SUB CF(r,g,b) CouleurFond(r,g,b) END_SUB rem ============================================================================ SUB GO() Gomme() END_SUB rem ============================================================================ SUB IC() InverseCrayon() END_SUB rem ============================================================================ SUB CO(r,g,b) Colorie(r,g,b) END_SUB rem ============================================================================ SUB DI(r) Disque(r) END_SUB rem ============================================================================ SUB OV(Rx,Ry) Ovale(Rx,Ry) END_SUB rem ============================================================================
' Anglais
rem ============================================================================ rem ############################################################################ rem ============================================================================
SUB Forward(pas) Avance(pas) END_SUB rem ============================================================================ SUB Back(pas) Recule(pas) END_SUB rem ============================================================================ SUB Turn_Left(a) Gauche(a) END_SUB rem ============================================================================ SUB Turn_Right(a) Droite(a) END_SUB rem ============================================================================ SUB Set_Heading(a) Cap(a) END_SUB rem ============================================================================ SUB Pen_Up() LeveCrayon() END_SUB rem ============================================================================ SUB Pen_Down() BaisseCrayon() END_SUB rem ============================================================================ SUB Set_Pen_Color(r,g,b) CouleurCrayon(r,g,b) END_SUB rem ============================================================================ SUB Set_BG_Color(r,g,b) CouleurFond(r,g,b) END_SUB rem ============================================================================ SUB Pen_Erase() Gomme() END_SUB rem ============================================================================ SUB Pen_Invert() InverseCrayon() END_SUB rem ============================================================================ SUB Pen_Paint(r,g,b) CO(r,g,b) END_SUB rem ============================================================================ SUB Draw_circle(r) Disque(r) END_SUB rem ============================================================================ SUB Draw_Ellipse(Rx,Ry) Ovale(Rx,Ry) END_SUB rem ============================================================================ SUB Draw_Cercle_Orthoptique(Rx,Ry) Cercle_Orthoptique(Rx,Ry) END_SUB rem ============================================================================ rem ############### FIN DU FICHIER ############################################# rem ============================================================================
Un exemple d'utilisation de Include_Turtle.bas - Code:
-
rem ============================================================================ rem Exemple d utilisation de rem Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici label fin caption 0,"Veuiller patienter ...... <CLICK> Pour arrêter" alpha 10 : top 10,100 : left 10,20 : font_size 10,20 : font_bold 10 : font_color 10,255,255,0 on_click 0,fin Nouveau() : Bouquet_Fleurs() : pause 1000 Nouveau() : Spirale() : pause 1000 Nouveau() : Set_BG_Color(0,0,255) : Set_Pen_Color(0,255,0) : Figure(108,10) : pause 1000 Nouveau() : Directions() : pause 1000 Nouveau() : Demo_1() : pause 1000 Nouveau() : Demo_2() : pause 1000 Nouveau() : Demo_3() : pause 1000 Nouveau() : Demo_Truc() : pause 1000 Nouveau() : Demo_Ellipse() print_locate Turtle_Xorigine/2 ,10 print "Cercle orthoptique de l'ellipse en rouge" print_locate Turtle_Xorigine/2 ,30 print "Cercle principale de l'ellipse en vert " print_locate Turtle_Xorigine/2 ,50 print "Cercle secondaire de l'ellipse en jaune " : pause 5000 Nouveau() : Fleurs_Aleatoires() : pause 1000 Nouveau() : Test_1() : pause 1000 Nouveau() : DrawAxis() : pause 1000 Nouveau() : Village() : pause 1000 Nouveau() : Rosace() : pause 1000 Nouveau() : Fleur() : pause 1000 Nouveau() : Trois_Bouquets() caption 10,"Fin du spactacle" caption 0,"Terminé" end ' Fin de votre programme rem ============================================================================ ' Vos procédures commencent ici SUB Spirale() dim_local n Set_Pen_Color(255,175,175) Pos_X(-200) for n = 1 to 360 : Turn_Right(6) : Carre(n/2) : next n Pos_X(200) for n = 1 to 380 : Turn_Left(6) : Carre(n/2) : next n END_SUB ' ------------------------------------------------------------------------------ SUB Carre(c) dim_local i for i = 1 to 4 : Forward(c) : Turn_Right(90) : next i END_SUB rem ============================================================================ SUB Cercle(pas,taille) dim_local i for i = 1 to pas : Turn_Right(360/pas) : Forward(taille) : next i END_SUB ' ------------------------------------------------------------------------------ SUB Figure(pas,taille) dim_local i for i = 1 to pas : Turn_Right(360/pas) : Cercle(pas,taille) : next i END_SUB rem ============================================================================ rem ############################################################################ SUB Bouquet_Fleurs() Set_BG_Color(0,0,0) : Set_Pen_Color(255,255,255) : Pen_UP() Back(150) : Base() : Bunch() END_SUB ' ------------------------------------------------------------------------------ ' Arc de 90° SUB Arch() dim_local i for i = 1 to 18 : Forward(4) : Turn_Right(5) : next i END_SUB ' ------------------------------------------------------------------------------ SUB Oval() Turn_Left(45) : Arch() : Turn_Right(90) : Arch() :Turn_Right(135) END_SUB ' ------------------------------------------------------------------------------ SUB Base() Turn_Right(90) : Back(30) : Pen_Down() : Set_Pen_Color(192,192,192) : Oval() Pen_Up() : Forward(30) : Turn_Left(90) END_SUB ' ------------------------------------------------------------------------------ SUB Leaf() Set_Pen_Color(0,255,0) : Forward(24) : Oval() : Back(24) END_SUB ' ------------------------------------------------------------------------------ SUB Section() Turn_Right(45) : Leaf() : Turn_Left(45) : Forward(24) Turn_Left(45) : Leaf() : Turn_Right(45) : Forward(24) END_SUB ' ------------------------------------------------------------------------------ SUB Stem() dim_local i Set_Pen_Color(0,255,0) : Forward(48) for i = 1 to 3 : Section() : next i Pen_Up() : Forward(64) : Pen_Down() END_SUB ' ------------------------------------------------------------------------------ SUB Petal() Set_Pen_Color(255,0,0) : Oval() END_SUB ' ------------------------------------------------------------------------------ SUB Flower() dim_local i for i = 1 to 18 Set_Pen_Color(255,255,0) : Forward(4) : Petal() Pen_Up() : Back(4) : Pen_Down() : Turn_Right(20) next i END_SUB ' ------------------------------------------------------------------------------ SUB Plant() Stem() : Flower() : Pen_Up() : Back(256) : Pen_Down() END_SUB ' ------------------------------------------------------------------------------ SUB Bunch() dim_local i Turn_Left(24) : Pen_Down() for i = 1 to 3 : Plant() : Turn_Right(24) : next i END_SUB rem ============================================================================ SUB Trois_Bouquets() Bouquet_Fleurs() Origine() : Pos_X(-400) : Bouquet_Fleurs() Origine() : Pos_X(400) : Bouquet_Fleurs() END_SUB rem ============================================================================ SUB Demo_1() dim_local i Set_Pen_Color(0,255,255) for i = 1 to 2026 : Set_Heading(0-360*(power(i,3)/2026)) : Forward(10) : next i END_SUB rem ============================================================================ SUB Demo_2() dim_local i,j,k for i = 1 to 4 for j = 1 to 8 for k = 1 to 4 : Turn_Right(90) : Forward(105) : next k Back(105) : Turn_left(45) next j Turn_Left(90) next i END_SUB rem ============================================================================ SUB Demo_3() dim_local i,j Set_Bg_Color(0,0,0) Set_Pen_Color(255,175,175) : ' crayon Rose for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i Pen_Invert() : ' crayon inverseur for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i Pen_Erase() : ' crayon effaceur for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i Set_Pen_Color(0,0,255) : ' crayon bleu for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i Pen_Invert() : ' crayon inverseur for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i Position_XY(-75,75) : Draw_circle(40) : Pen_Paint(255,0,0) END_SUB rem ============================================================================ SUB Demo_Truc() dim_local i for i = 4 to 12 step 4 : Nouveau() : Multi_Truc(i) : pause 1000 : next i for i = 8 to 1 step -4 : Nouveau() : Multi_Truc(i) : pause 1000 : next i END_SUB ' ============================================================================= SUB Truc() Forward(200) : Turn_Right(90) : Forward(100) : Turn_Left(90): Forward(50) Draw_Circle(10) : Pen_Paint(255,0,0) : Back(100) Draw_Circle(10) : Pen_Paint(255,255,0) : Forward(50) : Turn_Left(90) Forward(100) : Turn_Right(90) : Back(200) END_SUB ' ============================================================================= SUB Multi_Truc(n) dim_local i,a a = 360/n : Set_Pen_Color(0,255,255) for i = 1 to n : Truc() : Turn_Right(a) : next i END_SUB rem ============================================================================ rem ============================================================================ ' Tracer une flèche vers le haut SUB Fleche() Forward(300) : Turn_Right(135) Forward(30) : Back(30) : Turn_Left(270) Forward(30) : Back(30) : Turn_Right(135) : Back(300) END_SUB ' ------------------------------------------------------------------------------ SUB Directions() dim_local i for i = 1 to 16 : Fleche() : Turn_Right(360/16) : next i END_SUB rem ============================================================================ SUB Demo_Ellipse() Ovale(200,100) : Pen_Paint(0,0,255) Ovale(100,200) : Pen_Paint(0,255,0) Set_Pen_Color(255,0,0) : Draw_Cercle_Orthoptique(200,100) Set_Pen_Color(0,255,0) : Disque(200) Set_Pen_Color(0,255,255) : Disque(100) : Colorie(255,255,0) END_SUB rem ============================================================================ SUB Fleurs_Aleatoires() dim_local i CC(0,255,0) : LC() for i = 1 to 30 : flore() : next i END_SUB ' ------------------------------------------------------------------------------ SUB Flore() dim_local x,y,t,n,d,i BC() : CC(rnd(255),rnd(255),rnd(255)) x = 400-int(rnd(800)) : y = 300-int(rnd(600)) t = int(rnd(360)) : d = 2 + int(rnd(9)) : n = 0 for i = 1 to 72 Position_XY(x,y) : Cap(n + t) : AV(40*(1+cos(d*n*Turtle_rad))) : n = n + 5 next i LC() END_SUB rem ============================================================================ SUB Test_1() dim_local i,j for i = 1 to 2 : for j = 1 to 12 : AV(180) : TD(150) : next j : TD(180) : next i END_SUB rem ============================================================================ SUB Village() dim_local i BC() : TD(90) : AV(318) : RE(637) : TG(90) Maison(65) : Rue() Maison(45) : Rue() : Rue() Maison(55) : Rue() Maison(35) : Rue() Maison(75) for i = 1 to 6 : Rue() : next i Arbre() for i = 1 to 11 : Rue() : next i Arbre() LC() : Origine() : TG(90) : AV(270) : TD(90) AV(180) : Bc() : Soleil_1() END_SUB ' ------------------------------------------------------------------------------ SUB Mur(t) dim_local i CC(255,0,0) for i = 1 to 4 : AV(t) : TD(90) : next i TD(30) : LC() : AV(15) : BC() : LC() : RE(15) : TG(30) : BC() :' stop END_SUB ' ------------------------------------------------------------------------------ SUB Toit(t) dim_local i CC(255,0,0) for i = 1 to 3 : AV(t) : TD(120) : next i END_SUB ' ------------------------------------------------------------------------------ SUB Maison(t) Mur(t) : AV(t) : TD(30) : Toit(t) LC() : TG(30) : RE(t) : TD(90) : AV(t) : TG(90) : BC() END_SUB ' ------------------------------------------------------------------------------ SUB Rue() LC() : TD(90) : AV(10) : TG(90) : BC() END_SUB ' ------------------------------------------------------------------------------ SUB Tronc() dim_local i CC(153,102,0) : ' marron for i = 1 to 15 : AV(200) : RE(200) : TD(90) : AV(1) : TG(90) : next i END_SUB ' ------------------------------------------------------------------------------ SUB Feuille() Dim_local i CC(0,255,0) for i = 1 to 360 : AV(50) : RE(50) : TD(1) : next i END_SUB ' ------------------------------------------------------------------------------ SUB Arbre() CC(153,102,0) : ' marron Tronc() : AV(180) : TG(90) : AV(8) : TD(45) :CC(0,255,0) : Feuille() LC() : Cap(0) : RE(180) : TD(90) : AV(8) : TG(90) : BC() END_SUB ' ------------------------------------------------------------------------------ SUB Soleil_1() dim_local i CC(255,255,0) for i = 1 to 360 : LC() : AV(40) : BC() : AV(1) : LC() : RE(41) : TD(1) : BC() : next i for i = 1 to 60 : LC() : AV(40) : BC() : AV(35) : LC() : RE(75) : TD(6) : BC() : next i END_SUB ' ------------------------------------------------------------------------------ rem ============================================================================ SUB Arc(n) dim_local i for i = 1 to n : AV(3) : TD(1) : next i END_SUB ' ------------------------------------------------------------------------------ SUB Rosace() Pos_X(-200) Arc(360) : TD(60) : Arc(120) : TD(120) : ARC(120) : TD(120) ARC(120) : TD(60) : ARC(60) : TD(60) : ARC(120) : TD(120) ARC(120) : TD(120) : ARC(120) END_SUB ' ------------------------------------------------------------------------------ SUB Petale() Arc(90) : TD(90) : Arc(90) : TD(90) END_SUB ' ------------------------------------------------------------------------------ SUB Fleur() dim_local i for i = 1 to 18 : Petale() : TD(360/18) : next i END_SUB rem ============================================================================
Fin: caption 0, "Programme arrêté par l'utilisateur" end
rem ============================================================================ ' Fin des procédures rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
Dernière édition par papydall le Ven 26 Juin 2015 - 14:32, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 14:28 | |
| Génial, j'ai hâte de tester ça ce soir Ca va me rappeler des souvenir et on se servait de ça même en BTS pour illustrer la récursivité par des tracés. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 14:37 | |
| Pour la récursivité, tu sais que Panoramic Interpréteur ne permet pas la récursivité et c’est dommage. Panoramic Compilateur le permet parfaitement et j’ai obtenu des belles réalisations en utilisant la récursivité avec les Routines Tortue. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 14:56 | |
| Tu peux parfaitement obtenir une récursivité en Panoramic interprété, moyennant le respect de certaines règnes: - toutes les variables (et je dis bien "toutes") doivent être remplacées par des DLIST - en entrée dans une SUB, on crée une nouvelle "instance" de chaque variable dans la DLIST, au lieu d'utiliser DIM ou DIM_LOCAL. On crée une telle instance en plaçant la valeur par défaut dans la DLIST par ITEM_ADD ("0" pour un entier ou un flottant, et "" pour une chaîne de caractères) - en sortant d'une SUB, il faut supprimer l'instance de la variable en faisant ITEM_DELETE n%,COUNT(n%) - il faut utiliser ces variables uniquement sous forme d'expressions avec ITEM_READ$(n%,COUNT(n%))
Ainsi, on a une totale indépendance et et le code de la SUB devient "réentrant" comme on dit entre informaticiens, c'est-à-dire on peut l'appeler à nouveau en cours d'exécution. On peut avoir ainsi une récursivité réelle, directe (la procédure s'appelle elle-même) ou indirecte (la procedure en appelle une autre qui ... et qui appelle la procédure initiale).
Bon, j'en conviens, c'est lourd. En fait, c'est un exercice intellectuel que de concevoir de tels systèmes, mais ça marche ! Les DLIST sont vraiment magiques. Et comme pour un langage avec des procédures vraiment récursives, la profondeur est uniquement déterminée par la place en mémoire, pas par des considérations de programmation ou de langage. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 15:11 | |
| - papydall a écrit:
- Pour la récursivité, tu sais que Panoramic Interpréteur ne permet pas la récursivité et c’est dommage.
Panoramic Compilateur le permet parfaitement et j’ai obtenu des belles réalisations en utilisant la récursivité avec les Routines Tortue. En cherchant bien, tu trouveras des exemples de recursivité réalisé en Panoramic... Regarde sur mon site (les arbres binaires par exemple). Comme dis Klaus, c'est un peu tordu, mais avec des DLIST (utilisé comme une pile) on y arrive très bien | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 15:17 | |
| Oui, je me souviens bien de tes arbres de décisions. J'ai failli m'en servir pour mon jeu de dames, mais je n'ai pas eu le courage de me casser assez la tête pour mettre en place la mécanique de raisonnement jusqu'au bout. Mais pour revenir au sujet de la tortue, je verrais si je mets en pratique ton mécanisme pour refaire des sapin et autres dessins basé sur la tortue et les appels récursifs. Pourquoi pas... | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 15:29 | |
| Salut Klaus,Jicehel, Nardo26, Salut tout le monde Le code suivant, exécuté avec le compilateur - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici Arbre(350) end : ' fin de votre programme rem ============================================================================ ' Procédure récursive de tracé d'un bel arbre SUB Arbre(taille) if taille < 5 forward(taille) : forward(0-taille) else forward(taille/3) : turn_left(30) : Arbre(taille*2/3) : turn_right(30) forward(taille/6) : turn_right(25) : Arbre(taille/2) : turn_left(25) forward(taille/3) : turn_right(25) : Arbre(taille/2) : turn_left(25) forward(taille/6) : forward(0-taille) end_if END_SUB rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
Produit l’image suivante. - Spoiler:
Tu veux bien maître Klaus indiquer exactement le code à utiliser pour obtenir le même résultat sous l'interpréteur ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 15:41 | |
| Je vais réfléchir sur ton code, Papydall. En attentant, voici la factorielle en récursivité: - Code:
-
dim fact%
fact(7) message "5! = "+item_read$(1,count(1)) end
sub fact(n%) if object_exists(1)=0 list 1 item_add 1,"1" end_if if n%>1 item_add 1,str$(val(item_read$(1,count(1))) * n%) fact(n%-1) display end_if end_sub | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 15:42 | |
| Il est superbe ton exemple Papydall ! Bravo !!! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 15:49 | |
| @Nardo26 Avec les routines tortue, on peut obtenir des meilleurs !
Merci Klaus pour l’exemple. Rectif d'une erreur de frappe : message "7! = .... au lieu de 5 J’essaierai de comprendre ce code. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 15:56 | |
| Oui parfait exemple Papydall, bravo | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:00 | |
| Voila en recursif... - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ DIM PILE:PILE=1 DLIST PILE DIM taille Init_Turtle() : ' Indispensable ' Votre programme débute ici ITEM_ADD PILE,350 Arbre() end : ' fin de votre programme rem ============================================================================ ' Procédure récursive de tracé d'un bel arbre SUB Arbre() wait 1 ' On ne passe pas par un passage de parametre standard, on recupere la valeur qui se trouve dans la DLIST taille = VAL(ITEM_READ$(PILE,COUNT(PILE))) if taille < 5 forward(taille) : forward(0-taille) else forward(taille/3) : turn_left(30)
ITEM_ADD PILE, taille*2/3 : ' plutot que de passer la valeur en paramètre, on la stocke dans la DLIST Arbre() : ' Puis on fait l'appel ' Comme on vient de sortir de l'appel precedent, il faut revenir dans le contexte d'avant ' on récupère donc la valeur initiale de taille taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
turn_right(30) forward(taille/6) : turn_right(25) ITEM_ADD PILE,taille/2 : Arbre() ' retour au contexte avant l'appel taille = VAL(ITEM_READ$(PILE,COUNT(PILE))) turn_left(25) forward(taille/3) : turn_right(25) ITEM_ADD PILE,taille/2 Arbre() taille = VAL(ITEM_READ$(PILE,COUNT(PILE))) turn_left(25) forward(taille/6) : forward(0-taille) end_if ' Cet appel est terminé, son paramètre n'a plus de raison d'existé dans la DLIST ' on l'élimine... ITEM_DELETE PILE,COUNT(PILE) END_SUB rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
EDIT : j'ai rajouté des commentaires pour que tu comprennes... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:10 | |
| Voici le début de include_turtle.bas, adapté selon ces règles: - Code:
-
rem ============================================================================ rem Exemple d utilisation de rem Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ Init_Turtle() : ' Indispensable Dlist_Turtle() : ' Klaus: créer les DLIST pour remplacer les variables locales ' Votre programme débute ici label fin caption 0,"Veuiller patienter ...... <CLICK> Pour arrêter" alpha 10 : top 10,100 : left 10,20 : font_size 10,20 : font_bold 10 : font_color 10,255,255,0 on_click 0,fin Nouveau() : Bouquet_Fleurs() : pause 1000 Nouveau() : Spirale() : pause 1000 Nouveau() : Set_BG_Color(0,0,255) : Set_Pen_Color(0,255,0) : Figure(108,10) : pause 1000 Nouveau() : Directions() : pause 1000 Nouveau() : Demo_1() : pause 1000 Nouveau() : Demo_2() : pause 1000 Nouveau() : Demo_3() : pause 1000 Nouveau() : Demo_Truc() : pause 1000 Nouveau() : Demo_Ellipse() print_locate Turtle_Xorigine/2 ,10 print "Cercle orthoptique de l'ellipse en rouge" print_locate Turtle_Xorigine/2 ,30 print "Cercle principale de l'ellipse en vert " print_locate Turtle_Xorigine/2 ,50 print "Cercle secondaire de l'ellipse en jaune " : pause 5000 Nouveau() : Fleurs_Aleatoires() : pause 1000 Nouveau() : Test_1() : pause 1000 Nouveau() : DrawAxis() : pause 1000 Nouveau() : Village() : pause 1000 Nouveau() : Rosace() : pause 1000 Nouveau() : Fleur() : pause 1000 Nouveau() : Trois_Bouquets() caption 10,"Fin du spactacle" caption 0,"Terminé" end ' Fin de votre programme rem ============================================================================ ' ajout de Klaus: sub Dlist_Turtle() : ' Klaus: créer les DLIST pour remplacer les variables locales dlist 1001 ' ... autres DLIST pour d'aures variables locales end_sub ' Vos procédures commencent ici SUB Spirale() item_add 1001,"0" : ' dim_local n créer la variable à ce niveau Set_Pen_Color(255,175,175) Pos_X(-200) ' for n = 1 to 360 : Turn_Right(6) : Carre(n/2) : next n item_delete 1001,count(1001) item_add 1001,"1" : repeat : ' for n=1... Turn_Right(6) Carre(val(item_read$(1001,count(1001)))/2) : ' Carre(n/2) item_add 1001,str$(val(item_read$(1001,count(1001)))+1) item_delete 1001,count(1001)-1 until val(item_read$(1001,count(1001)))=360 : ' next n Pos_X(200) ' for n = 1 to 380 : Turn_Left(6) : Carre(n/2) : next n item_delete 1001,count(1001) item_add 1001,"1" : repeat : ' for n=1 Turn_Left(6) Carre(val(item_read$(1001,count(1001)))/2) : ' Carre(n/2) item_add 1001,str$(val(item_read$(1001,count(1001)))+1) item_delete 1001,count(1001)-1 until val(item_read$(1001,count(1001)))=380 : ' next n item_delete 1001,count(1001) : ' libérer la variable à ce niveau END_SUB
Tu vois que j'ai créé une nouvelle procédure Dlist_Turtle() qui est appelée immédiatement apès Init_Turtle(). Son rôle est la création de toutes les DLIST qui remplaceront les variables locales. Ensuite, j'ai adapté la première procédure Spirale() pour la rendre réentrante. J'ai remplacé la variable locale n par la dlist 1001, et il n'y a plus de variables locales dans la procédure. Bon, tu vois le principe. Je reconnais - c'est lourd, fastidieux, tout ce que tu veux. Mais techniquement, c'est possible. Pour moi, c'était le but: prouver la faisabilité technique, mais pas de produire une version rapide ou facile à mettre en oeuvre. Je voulais juste démontrer que c'est possible. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:17 | |
| Bravo Nardo26 Ça marche. Une légère modif pour centrer l’arbre - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ DIM PILE:PILE=1 DLIST 1 DIM taille Init_Turtle() : ' Indispensable ' Votre programme débute ici ITEM_ADD PILE,350 Pos_Y(-200) : CC(0,255,0) : Arbre() Caption 0,"terminé" end : ' fin de votre programme rem ============================================================================ ' Procédure récursive de tracé d'un bel arbre SUB Arbre() taille = VAL(ITEM_READ$(PILE,COUNT(PILE))) if taille < 5 forward(taille) : forward(0-taille) else forward(taille/3) : turn_left(30) ITEM_ADD PILE, taille*2/3 Arbre() taille = VAL(ITEM_READ$(PILE,COUNT(PILE))) turn_right(30) forward(taille/6) : turn_right(25) ITEM_ADD PILE,taille/2 Arbre() taille = VAL(ITEM_READ$(PILE,COUNT(PILE))) turn_left(25) forward(taille/3) : turn_right(25) ITEM_ADD PILE,taille/2 Arbre() taille = VAL(ITEM_READ$(PILE,COUNT(PILE))) turn_left(25) forward(taille/6) : forward(0-taille) end_if ITEM_DELETE PILE,COUNT(PILE) END_SUB rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
@Klaus Merci. je vais voir ça pour mon instruction! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:19 | |
| Oui j'ai vu, et j'avais fait ceci, ce qui revient à la même chose : - Code:
-
... Init_Turtle() : ' Indispensable ' Votre programme débute ici Turtle_Pen_Up_Down=1 Recule(100) Turtle_Pen_Up_Down=0
Pour la gestion de la DLIST, pour gagner en lisibilité, tu peux t'amuser à créer des procédures PUSH() / POP().. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:38 | |
| - Klaus a écrit:
- Bon, tu vois le principe. Je reconnais - c'est lourd, fastidieux, tout ce que tu veux. Mais techniquement, c'est possible. Pour moi, c'était le but: prouver la faisabilité technique, mais pas de produire une version rapide ou facile à mettre en oeuvre. Je voulais juste démontrer que c'est possible.
Parfaitement clair. J'ai testé et ça marche, mais comme tu disais ce n'est pas pratique à mettre en oeuvre . Bravo tu as réalisé le but. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:41 | |
| | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:49 | |
| Tu n'es pas obligé de créer plusieurs DLIST Klaus, il suffit de bien mémoriser dans quel ordre tu insères les paramètres dans la dlist. C'est une pile LIFO...
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 16:51 | |
| @Nardo Turtle_Pen_Up_Down est une variable gérée par le programme et l’utilisateur n’a pas à s'en soucier. Pour cela, on utilise les commandes : LeveCrayon() ou LC() ou Pen_Up() (pour se déplacer sans laisser de traces) BaisseCrayon() ouBC() ou Pen_Down() ( pour se déplacer en dessinant) | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 17:16 | |
| Bravo Papydall, C'est super, avec des résultats surprenants de beauté.
Les créateurs de joligone et autres dessins vont pouvoir s'en donner à cœur joie.
A+
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 17:28 | |
| Merci Jean Claude. Toi aussi, tu peux exhiber tes talents de créateurs de belles images avec les routines tortue. Un peu de réflexion, une bonne dose d’amour de Panoramic et surtout du temps libre, c’est qui manque le plus à la majorité. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 17:34 | |
| Une très simple. J'ai voulu colorier l'intérieur des rectangles avec Colorie(r,g,b), mais je n'ai pas réussi. - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================
dim n% rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici ' Rectangle(screen_x/4,screen_y/4) CouleurFond(0,0,0) for n%=1 to 360 step 10 CouleurCrayon(rnd(255),rnd(255),rnd(255)) Rectangle_Oblique(n%,screen_x/8,screen_y/8) next n% end : ' fin de votre programme rem ============================================================================ ' Vos procédures ici SUB Rectangle(long,larg) dim_local i for i = 1 to 2 : AV(larg) : TD(90) : AV(long) : TD(90) : next i END_SUB ' SUB Rectangle_Oblique(ang,long,larg) Cap(ang) : Rectangle(long,larg) END_SUB ' ' Fin de vos procédures rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! ' #Include "Include_Turtle.bas" rem =========================== FIN ============================================
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 17:38 | |
| Merci Papydall pour cette précision... J'ai simplifié l'utilisation de la récursivite. Jette un coup d'oeil à ceci, cela pourra te donner des idées. - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================
Init_Turtle() : ' Indispensable ' Votre programme débute ici LeveCrayon() Recule(200) BaisseCrayon()
PUSH(50): Arbre() MessageBox("That's all folks !","Routine tortue par Papydall",1,2)
end : ' fin de votre programme
rem ============================================================================ ' Procédure récursive de tracé d'un bel arbre rem ============================================================================ SUB Arbre() IF VARIABLE("taille")=0 THEN DIM taille wait 1 ' On ne passe pas par un passage de parametre standard, on recupere la valeur qui se trouve dans la DLIST POP(): taille=POP_RETURN if taille < 5 forward(taille) : forward(0-taille) else forward(taille/3) : turn_left(30)
PUSH(taille*2/3) : Arbre()
turn_right(30) forward(taille/6) : turn_right(25)
PUSH(taille/2) : Arbre()
turn_left(25) forward(taille/3) : turn_right(25)
PUSH(taille/2) : Arbre()
turn_left(25) forward(taille/6) : forward(0-taille) end_if ' Cet appel est terminé, son paramètre n'a plus de raison d'existé dans la DLIST ' on l'élimine et on recupere l'ancienne valeur... CLR() : POP(): taille=POP_RETURN END_SUB
SUB PUSH(v) IF VARIABLE("PILE")=0 DIM PILE: PILE = NUMBER_OBJECTS + 1 : DLIST PILE END_IF ITEM_ADD PILE,v END_SUB
SUB POP() IF VARIABLE("POP_return")=0 THEN DIM POP_return IF COUNT(PILE)<>0 THEN POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE))) END_SUB
SUB CLR() IF COUNT(PILE)<>0 THEN ITEM_DELETE PILE,COUNT(PILE) END_SUB
rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
sub MessageBox(txt$,tit$,popt%,pico%) ' Valeurs possibles pour popt%: ' 1 = MB_OK = 0x00000000L - one push button: OK. This is the default. ' 2 = MB_OKCANCEL = 0x00000001L - two push buttons: OK and Cancel. ' 3 = MB_RETRYCANCEL = 0x00000005L - two push buttons: Retry and Cancel. ' 4 = MB_YESNO = 0x00000004L - two push buttons: Yes and No. ' 5 = MB_YESNOCANCEL = 0x00000003L - three push buttons: Yes, No, and Cancel. ' ' Valeurs possibles pour pico%: ' 1 = MB_ICONWARNING = 0x00000030L - An exclamation-point icon appears in the message box. ' 2 = MB_ICONINFORMATION = 0x00000040L - An icon consisting of a lowercase letter i in a circle appears in the message box. ' 3 = MB_ICONQUESTION = 0x00000020L - A question-mark icon appears in the message box. The question-mark message icon is no longer recommended because it does not clearly represent a specific type of message and because the phrasing of a message as a question could apply to any message type. In addition, users can confuse the message symbol question mark with Help information. Therefore, do not use this question mark message symbol in your message boxes. The system continues to support its inclusion only for backward compatibility. ' 4 = MB_ICONSTOP = 0x00000010L - A stop-sign icon appears in the message box.
dim_local res%, ad1%, hdc%, ad2%, ad3%, opt%, ico% if variable("MessageBox%")=0 then dim MessageBox%
dll_on "User32.dll"
ad1% = adr(txt$) poke adr(ad2%),peek(ad1%) poke adr(ad2%+1),peek(ad1%+1) poke adr(ad2%+2),peek(ad1%+2) poke adr(ad2%+3),peek(ad1%+3) ad1% = adr(tit$) poke adr(ad3%),peek(ad1%) poke adr(ad3%+1),peek(ad1%+1) poke adr(ad3%+2),peek(ad1%+2) poke adr(ad3%+3),peek(ad1%+3)
if popt%=1 then opt% = 0 if popt%=2 then opt% = 1 if popt%=3 then opt% = 5 if popt%=4 then opt% = 4 if popt%=5 then opt% = 3
if pico%=1 then ico% = 48 if pico%=2 then ico% = 64 if pico%=3 then ico% = 32 if pico%=4 then ico% = 16
MessageBox% = dll_call4("MessageBoxA",0,ad2%,ad3%,opt%+ico%)
dll_off end_sub
EDIT à 21:04 : Prise en compte des remarques de Papydall.
Dernière édition par Nardo26 le Ven 26 Juin 2015 - 21:04, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 17:43 | |
| Classe Nardo, je retourne 20 ans en arrière dans mes cours sur la récursivité et le code est on ne peut plus simple et lisible. Bravo à tous pour cette adaptation des grands classiques.
| |
| | | Contenu sponsorisé
| Sujet: Re: Les routines Tortue | |
| |
| | | | Les routines Tortue | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |