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: Re: Les routines Tortue Ven 26 Juin 2015 - 18:55 | |
| Merci Nardo26 Comme disait Jicehel, le code est simple et lisible. J’ai du ajouter un test - Code:
-
SUB POP() IF COUNT(PILE) > 0 POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE))) END_IF END_SUB
Car j’ai obtenu un message d’erreur du genre … call with negative or zero value… Nous avons un jeune Jicehel âgé de 20 ans. Salut jeune homme ! | |
| | | 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 - 19:07 | |
| - Jean Claude a écrit:
- J'ai voulu colorier l'intérieur des rectangles avec Colorie(r,g,b), mais je n'ai pas réussi.
La commande Colorie(r,g,b) fait un flood à partir de la position de la tortue. On doit d'abord positionner la tortue au bon endroit. Pour cela, on dispose de: Pos_X(n) Pos_Y(n) Position_XY(x,y)Ces positions sont relatives (par rapport à l'origine qui est le centre de l'écran) | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Ven 26 Juin 2015 - 19:08 | |
| Oups ! Oui, un oubli de ma part... L'exemple précédent est simple car il n'y a pas de valeur de retour. Là où cela se corse c'est lorsque l'on doit simuler des FONCTIONS récursives : il faut aussi empiler la valeur de retour... Par exemple : - Code:
-
DIM PILE:PILE=1 : DLIST PILE
PUSH(10): fact()
message "10! = "+STR$(FACT_return)
end
SUB fact() IF VARIABLE("FACT_return")=0 THEN DIM FACT_return, FACT_n% POP(): FACT_n% = POP_return : CLR() FACT_return = FACT_n% IF FACT_return = 1 PUSH(FACT_return) ELSE PUSH(FACT_n%) FACT_n% = FACT_n% - 1 : PUSH(FACT_n%) : FACT() POP() : FACT_return = POP_return : CLR() POP() : FACT_n% = POP_return : CLR() FACT_return = FACT_n% * FACT_return PUSH(FACT_return) END_IF END_SUB
SUB PUSH(v) 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
En attendant ta simulation de LOGO est excellente !! EDIT : J'ai modifié le code au dessus (arbre) pour prendre en compte les remarques de Papydall + quelques fct supplémentaires en rappel pour les nouveaux... | |
| | | 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 Sam 27 Juin 2015 - 1:53 | |
| Et pourquoi pas toute une forêt ? - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================
Init_Turtle() : ' Indispensable ' Votre programme débute ici caption 0, "<CLICK> pour arrêter" CC(0,255,0) : Foret() caption 0,"Programme arrêté par l'utilisateur" 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 ' Astuce de Nardo26 ------------------------------------------------------------ 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 ============================================================================ SUB Foret() dim_local n,x x = width(0) repeat n = int(rnd(200) + 50) Position_XY(int(rnd(x)-x/2),int(rnd(200)-100)) PUSH(n) : Arbre() until scancode <> 0 END_SUB
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 Sam 27 Juin 2015 - 2:04 | |
| PapyDall ! J'essaye de réaliser un flocon de Von-Koch en récursif mais pour l'instant je coince un peu... Pour l'instant j'en suis là mais cela ne fonctionne pas correctement: - Code:
-
DIM K: K=3
Flocon(250,5) ' Pile : ' 1: Longueur ' 0: N SUB Segment() IF VARIABLE("Segment_N")=0 THEN DIM Segment_N,Segment_L WAIT 1 POP(0):Segment_N=POP_return POP(1):Segment_L=POP_return IF Segment_N=1 Forward(Segment_L) CLR():CLR() ELSE PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() : turn_left(60) PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() : turn_right(120) PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() : turn_left(60) PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() END_IF
POP(0):Segment_N=POP_return POP(1):Segment_L=POP_return END_SUB
SUB Flocon(longueur,n) DIM_LOCAL floc_i FOR floc_i=1 TO K PUSH(longueur):PUSH(n):Segment() turn_right(360/K) NEXT floc_i END_SUB
J'ai modifié la procedure POP pour pouvoir recupérer plusieurs paramètres dans la DLIST - Code:
-
SUB POP(of7) IF VARIABLE("POP_return")=0 THEN DIM POP_return POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE)-of7)) END_SUB
Par contre la fct SPI marche bien : - Code:
-
PUSH(200): spi()
SUB Spi() POP(0) IF POP_return>1 forward(250) turn_left(103) PUSH(POP_return-1) : Spi() END_IF CLR() END_SUB | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Les routines Tortue Sam 27 Juin 2015 - 7:34 | |
| J'ai testé, j'adore et on peut vraiment créer facilement de belles images. Un petit exemple de mise en pratique de la tortue (pas récursif, pas besoin pour cet essai) - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ DIM Cpt%, Cpt2% Init_Turtle() : ' Indispensable ' Votre programme débute ici For Cpt% = 1 to 56 LC() : Position_XY(10 - width(0)/2, height(0)/2 - 15 * Cpt% -15 ) : BC() For Cpt2% = 1 to 111 : CC(abs(55-Cpt2%)*4,Cpt% * 4,50) : Carre() : Next Cpt2% Next Cpt% end : ' fin de votre programme rem ============================================================================ ' Procédure récursive de tracé d'un bel arbre SUB Carre() TD(135): Avance(5) : TG(90) : Avance(5) : TG(90) : Avance(10) TG(90) : Avance(10) : TG(90) : Avance(15) : TG(90) : Avance(15) : TG(45) END_SUB 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 Sam 27 Juin 2015 - 15:09 | |
| Bon je dois être un peu maso de passer du temps sur ceci quand on voit le résultat final... Mais j'ai réussi le "flocon" (qui ressemble pas vraiment à un flocon mais je ne dois pas avoir mis les bons paramètres ) - Code:
-
Init_Turtle() : ' Indispensable LeveCrayon() Recule(200) BaisseCrayon() Flocon2(880,8,7) Origine(): position_XY(-150,-150) PUSH(200): spi() end
rem ============================================================================ rem Vos procedures rem ============================================================================
' Procédure récursive avec 2 paramètres ' Appel : Segment(Longueur, N) ' Pile offset : ' 1: Longueur ' 0: N
SUB Segment() WAIT 1 IF VARIABLE("Segment_N")=0 THEN DIM Segment_N,Segment_L,Segment_tmp
' on récupère les parametres dans la DLIST POP(0):Segment_N=POP_return : POP(1):Segment_L=POP_return IF Segment_N=1 POP2(0):Segment_L=POP2_return:CLR2() Forward(Segment_L) CLR():CLR() POP(0):Segment_N=POP_return : POP(1):Segment_L=POP_return ELSE PUSH2(Segment_L):PUSH2(Segment_N) PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() POP2(0):Segment_L=POP2_return:CLR2() turn_left(60)
PUSH2(Segment_L):PUSH2(Segment_N) PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() POP2(0):Segment_L=POP2_return:CLR2() turn_right(120)
PUSH2(Segment_L):PUSH2(Segment_N) PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() POP2(0):Segment_L=POP2_return:CLR2() turn_left(60) PUSH2(Segment_L):PUSH2(Segment_N) PUSH(Segment_L/3):PUSH(Segment_N-1): Segment() POP2(0):Segment_L=POP2_return:CLR2()
' restitution du contexte avant sortie de la procédure POP(0):Segment_N=POP_return : POP(1):Segment_L=POP_return CLR():CLR() : ' on retire de la pile ces deux paramètres POP2(0):Segment_L=POP2_return:CLR2() END_IF
END_SUB
SUB Flocon(taille,n) PUSH(taille):PUSH(n): Segment() turn_right(120) PUSH(taille):PUSH(n): Segment() turn_right(120) PUSH(taille):PUSH(n): Segment() END_SUB
SUB Flocon2(taille,n,a) DIM_LOCAL i a=360/a FOR i = 0 TO 360 STEP a PUSH(taille):PUSH(n): Segment() turn_right(a) NEXT i END_SUB
SUB Spi() POP(0) IF POP_return>1 forward(250) turn_left(103) PUSH(POP_return-1) : Spi() END_IF CLR() END_SUB
rem ============================================================================ rem Specifique recursivité rem ============================================================================
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(of7) IF VARIABLE("POP_return")=0 THEN DIM POP_return IF COUNT(PILE)<>0 THEN POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE)-of7)) END_SUB
SUB CLR() IF COUNT(PILE)<>0 THEN ITEM_DELETE PILE,COUNT(PILE) END_SUB
SUB PUSH2(v) IF VARIABLE("PILE2")=0 DIM PILE2:PILE2=NUMBER_OBJECTS+1:DLIST PILE2 END_IF ITEM_ADD PILE2,v END_SUB
SUB POP2(of7) IF VARIABLE("POP2_return")=0 THEN DIM POP2_return IF COUNT(PILE2)<>0 THEN POP2_return=VAL(ITEM_READ$(PILE2,COUNT(PILE2)-of7)) END_SUB
SUB CLR2() IF COUNT(PILE2)<>0 THEN ITEM_DELETE PILE2,COUNT(PILE2) END_SUB
SUB RIGHT(N,pos) LEFT N,SCREEN_X-pos-WIDTH(N) END_SUB
rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
Klaus, tu m'a fait mentir : dans cet exemple j'ai été obligé d'utiliser 2 DLIST... mais je soupçonne d'être passé à côté de quelque chose... Normalement avec ce genre de fonction on est sensé obtenir ce genre de graph : - exemple:
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 27 Juin 2015 - 16:24 | |
| J' ai une question à la c... Cela fait deux jours que je vous regarde disserter sur les tortues. Les routines Lapin, c' est pour quand ? Bon, j' ai compris, je sors... Désolé, j' ai pas pu m' en empêcher... fallait bien qu' il y en ait un qui la fasse ... | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Sam 27 Juin 2015 - 16:52 | |
| Le Langage Lapin ? Pas encore, mais si tu veux je peux te faire le langage orang-outan (c'est un dérivé de BF). Il existe réellement !!! Par exemple pour afficher "Hello world" il te faut écrire en langage Ook : - Code:
-
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook! Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook. Ook! Ook. Ook. Ook? Ook! Ook. Ook? Ook? Mais bonjour la prise de tête !! Voir ici : https://fr.wikipedia.org/wiki/Brainfuck#Ook.21@Papydall : la commande DrawAxis() te fait perdre la position de la tortue... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 27 Juin 2015 - 18:44 | |
| Moi qui pensait atteindre le sommet de la connerie avec la routine Lapin... ...y en a un plus tordu que moi qui a créé ce langage. | |
| | | 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 Dim 28 Juin 2015 - 1:48 | |
| - Nardo26 a écrit:
- Bon je dois être un peu maso de passer du temps sur ceci quand on voit le résultat final...
Mais j'ai réussi le "flocon" (qui ressemble pas vraiment à un flocon mais je ne dois pas avoir mis les bons paramètres ) Voulant comprendre ta méthode d'appel récursif, et étant moi-même un peu (trop) têtu, j'ai réussi enfin à obtenir le flocon de Von Koch - Code:
-
rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici Flocon_Koch() caption 0,"terminé" end rem ============================================================================ SUB Flocon_Koch() dim_local i Position_XY(-200,100 ) : Turn_Right(90) while i < 3 PUSH(4) : Koch() : TURN_Right(120) : i = i + 1 end_while END_SUB
rem ============================================================================ SUB Koch() IF VARIABLE("iterations")=0 THEN DIM iterations POP() iterations = POP_return if iterations = 0 forward(5) else PUSH(iterations - 1) : Koch() Turn_Left(60) : PUSH(iterations - 1) : Koch() Turn_right(120) : PUSH(iterations - 1) : Koch() Turn_Left(60) : PUSH(iterations - 1) : Koch() end_if CLR() : POP(): iterations = POP_RETURN END_SUB rem ============================================================================ ' Astuce de Nardo26 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 ============================================
C'est tordu, mais c'est faisable. Si Panoramic permettrait la récursivité, ça sera beaucoup plus aisé! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Dim 28 Juin 2015 - 3:09 | |
| Bravo Papy ! Ta solution est limpide ! Je comprend pas pourquoi je suis parti dans un truc aussi tordu... - Papydall a écrit:
- Si Panoramic permettrait la récursivité, ça sera beaucoup plus aisé!
Pour cela il nous faudrait les fct.... Bon j'arrête de tourner le couteau dans la plaie de Jack... PS: ils ne gagneront 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 Dim 28 Juin 2015 - 4:20 | |
| @Nardo26
Non, ils ne gagneront pas... J'en suis convaincu. | |
| | | Parpaiun
Nombre de messages : 192 Age : 85 Localisation : HERAULT Date d'inscription : 15/04/2015
| Sujet: Revue du sujet Dim 28 Juin 2015 - 10:48 | |
| Oah, c'est marrant ! (comme dit Gaston Lagaffe). Il y a quelque temps, j'avais construit un programme "SEMI-LOGO" où il est justement question d'une tortue sous forme abstraite. Pour l'instant, j'ai mis ce programme en suspens pour d'autres chats à fouetter (la S.P.A. m'a prié instamment de ne pas torturer les animaux, que je respecte d'ailleurs)... Le langage orang-outan de Nardo26 m'a paru un peu trop long pour les 10 seuls caractères de "Hello world" ! De toutes façons, le résultat est totalement intraduisible donc inutile pour nous panoramiciens ! Nardo26 est il devenu un peu erratique ? "Alphonse Allais (c'est raté pour y mettre Nardo26 à la place) de l'âme erre et se fout à l'eau" "Ah le fond salé de la mer, hé ce fou, hallo!" Avez vous bien saisi cette olorime ? Pour papydall, il y a longtemps que j'ai reproduit par programme le fameux flocon de Von Koch. Je respecte toujours tout ce qu'il fait, le brave et courageux Papydall ! Quant à la récursivité, c'est un truc absolument épatant mais vachement compliqué à suivre, je dois vous le dire ! Bonne journée et rafraîchissez vous bien les idées sous cette canicule ! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Dim 28 Juin 2015 - 12:20 | |
| L’avantage de ce genre de langage réside dans le peu d'instructions qu'il possède. Avec juste 8 instructions de base, on peut réaliser des calculs intéressants. D'ailleurs à une époque, ils ne s'étaient pas trompé en revenant sur des processeurs RISC... Dans le cas du BF, ce sont des opcode qui sont très facile à réaliser avec quelques composants électroniques (ou à lampes comme dans l'ancien temps). Pour ceux que cela interesse, il existe même un interpréteur pour les cartes ARDUINO ! (comme quoi, ce type de langage ne laisse pas tous le monde insensible) Un autre avantage: il peut être codifié et interprété à partir de bandes perfos... Concernant le langage orang-outan ou MOO (MOW pour les anglo-saxon) ce sont des variantes qui ont été réalisés juste pour le fun : Des compétitions sont même parfois organisés. C'est un sacré challenge de faire par exemple du fractal en BF !!! L'informatique et en particulier Panoramic, sert aussi à satisfaire notre curiosité, faire travailler les méninges mais surtout à s'amuser... | |
| | | 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 Dim 28 Juin 2015 - 18:18 | |
| - Nardo26 a écrit:
- @Papydall : la commande DrawAxis() te fait perdre la position de la tortue...
J’ai revu ma copie. Maintenant il est possible de graduer ou non les axes. On peut aussi tracer une grille. J’ai aussi apporté d’autres modifications. Il est donc indispensable d’utiliser le nouveau code. Le voici - Code:
-
rem ============================================================================ rem Include_Turtle.bas rem Auteur : Papydall rem ============================================================================ rem Fichier à inclure à la fin de votre code rem Votre programme doit avoir la structure suivante: rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici
end rem ============================================================================ ' Vos procédures ici rem rem rem ' Fin des procédures rem ============================================================================ ' #Include "Include_Turtle.bas" rem ============================================================================ 'Voici le fichier Include_Turtle.bas 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() CouleurCrayon(255,255,255) : ' Tracé en blanc CouleurFond(0,0,0) : ' Fond noir Origine() cls : Origine() : ' Ramener la tortue à l'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() 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 ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' AV(pas) ' Foreward(pas) ' ------------------------------------------------------------------------------ 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 ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' RE(pas) ' Back(pas) ' ------------------------------------------------------------------------------ SUB Recule(pas) Avance(0-pas) END_SUB rem ============================================================================ ' Tourner à gauche (sens trigonométrique) de a degrés ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' TG(a) ' Turn_Left(a) ' ------------------------------------------------------------------------------ SUB Gauche(a) New_Turtle_Heading = New_Turtle_Heading + a * Turtle_rad END_SUB rem ============================================================================ ' Tourner à droite (sens horaire) de a degrés ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' TD(a) ' Turn_Right(a) ' ------------------------------------------------------------------------------ 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 selon la rose du vent ' ------------------------------------------------------------------------------ ' 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 ' ------------------------------------------------------------------------------ ' Autre syntaxe : ' Set_Heading(a) ' ------------------------------------------------------------------------------ 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 ' Si unite > 0 , l'axe sera gradué en unité, sinon l'axe ne sera pas gradué SUB DrawAxisX(unite) dim i 2d_line 0,Turtle_Yorigine,2*Turtle_Xorigine,Turtle_Yorigine Origine() for i = 0 to width(0)/2 step unite Position_XY(i,0) : AV(5) : RE(10) Position_XY(0-i,0) : AV(5) : RE(10) next i Position_XY(0,0) : Origine() END_SUB rem ============================================================================ ' Tracer l'axe des Y ' Si unite > 0 , l'axe sera gradué en unité, sinon l'axe ne sera pas gradué SUB DrawAxisY(unite) dim_local i 2d_line Turtle_Xorigine,0,Turtle_Xorigine,2*Turtle_Yorigine Origine() : cap(90) for i = 0 to height(0)/2 step unite Position_XY(0,i) : AV(5) : RE(10) Position_XY(0,0-i) : AV(5) : RE(10) next i Position_XY(0,0) : Origine() END_SUB rem ============================================================================ ' Tracer les 2 axes X et Y ' Si unite > 0 , les axes seront gradués en unité, sinon ils ne seront pas gradués SUB DrawAxis(unite) DrawAxisX(unite) : DrawAxisY(unite) END_SUB rem ============================================================================ ' Tracer un grille SUB Grille(unite) dim_local i for i = 0 to width(0)/2 step unite 2d_line 0,Turtle_Yorigine-i,2*Turtle_Xorigine,Turtle_Yorigine-i 2d_line 0,Turtle_Yorigine+i,2*Turtle_Xorigine,Turtle_Yorigine+i next i for i = 0 to width(0)/2 step unite 2d_line Turtle_Xorigine+i,0,Turtle_Xorigine+i,2*Turtle_Yorigine 2d_line Turtle_Xorigine-i,0,Turtle_Xorigine-i,2*Turtle_Yorigine next i END_SUB rem ============================================================================ ' On modifie l'état du crayon ' Lever le stylo : le déplacement de la tortue ne laisse pas de trace ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' LC() ' Pen_UP() ' ------------------------------------------------------------------------------ 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 ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' BC() ' Pen_Down() ' ------------------------------------------------------------------------------ SUB BaisseCrayon() Turtle_Pen_Up_Down = 0 END_SUB rem ============================================================================ ' Fixer la couleur du tracé ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' CC(r,g,b) ' Set_Pen_Color(r,g,b) ' ------------------------------------------------------------------------------ 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 ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' CF(r,g,b) ' Set_BG_Color(r,g,b) ' ------------------------------------------------------------------------------ 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 ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' GO() ' Pen_Erase() ' ------------------------------------------------------------------------------ SUB Gomme() 2d_pen_color Turtle_FR, Turtle_FG, Turtle_FB END_SUB rem ============================================================================ ' Inverser la couleur du crayon ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' IC(_ ' Pen_Invert() ' ------------------------------------------------------------------------------ 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 ' ------------------------------------------------------------------------------ ' Autres syntaxes : ' CO(r,g,b) ' Pen_Paint(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 ' Autres syntaxes : ' ------------------------------------------------------------------------------ ' DI(r) ' Draw_circle(r) ' ------------------------------------------------------------------------------ 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 ' Autres syntaxes : ' ------------------------------------------------------------------------------ ' OV(Rx,Ry) ' Draw_Ellipse(Rx,Ry) ' ------------------------------------------------------------------------------ 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) ' ------------------------------------------------------------------------------ ' Autre syntaxe : ' Draw_Orthoptic_Circle(Rx,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_Orthoptic_Circle(Rx,Ry) Cercle_Orthoptique(Rx,Ry) END_SUB rem ============================================================================ rem ############### FIN DU FICHIER ############################################# rem ============================================================================
Un exemple d’utilisation de la récursivité par la méthode de Nardo26. Un grand merci aussi à Klaus. - Code:
-
rem ============================================================================ rem Utilisation de Include_Turtle.bas rem Auteur : Papydall rem ============================================================================
Init_Turtle() : ' Indispensable ' Votre programme débute ici
caption 0, "<CLICK> pour arrêter" Tournesol() Origine() : CC(0,255,0) : Position_XY(400,-200) : PUSH(200) : Arbre() Position_XY(-400,-200) : PUSH(500) : Fougere() caption 0,"Terminé" end : ' fin de votre programme rem ============================================================================ SUB Tournesol() dim_local angle, rayon, i Nouveau() : LC() : CC(255,255,0) : angle = 200 for i = 1 to 404 rayon = 0.6*power(angle,1/2) Origine() : cap(angle) : AV(rayon) Graine() angle = angle +222.5 if scancode <> 0 then Fin() next i BC() END_SUB ' ------------------------------------------------------------------------------ SUB Graine() dim_local i TG(45) : BC() for i = 1 to 4 : RE(7) : TD(90) : next i LC() : TD(45) : RE(5) : CO(255,255,0) END_SUB rem ============================================================================ SUB Arbre() IF VARIABLE("taille")=0 THEN DIM taille 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) if scancode <> 0 then Fin() end_if CLR() : POP(): taille=POP_RETURN END_SUB rem ============================================================================ SUB Fougere() IF VARIABLE("taille")=0 THEN DIM taille POP(): taille = POP_RETURN if taille < 5 ' on ne fait rien else AV(taille/20) TG(80) : PUSH(taille * .3) : Fougere() TD(82) : AV(taille/20) TD(80) : PUSH(taille * .3) : Fougere() TG(78) : PUSH(taille * .9) : Fougere() TG(02) : RE(taille / 20) : TG(02) : RE(taille / 20) if scancode <> 0 then Fin() end_if CLR() : POP(): taille=POP_RETURN
END_SUB rem ============================================================================ ' Astuce de Nardo26 ------------------------------------------------------------ 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 ============================================================================ SUB Fin() caption 0, "Programme arrêté par l'utilisateur" end END_SUB
rem ============================================================================ ' !!!!! LA COMMANDE A NE PAS OUBLIER !!!!! #Include "Include_Turtle.bas" rem =========================== FIN ============================================
Avec ces routines, on peut faire des beaux dessins. Amusez-vous bien ! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Dim 28 Juin 2015 - 22:34 | |
| Le résultat est superbe ! La fougère est un peu long à se dessiner mais le résultat est | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Lun 29 Juin 2015 - 23:40 | |
| La fonction Dragon :Pour cette fonction il était nécessaire de passer 3 paramètres à la fonction récursive. La procédure POP() a donc été modifiée dans ce sens. J'ai rajouté aussi une sécurité: l'appui sur une touche quelconque du clavier permet de sortir des fct récursives... J'ai également adapté la fonction Flocon_Koch de Papydall pour être compatible avec cette nouvelle version de POP() - Code:
-
rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici
Flocon_Koch() Courbe_Dragon(200,10)
caption 0,"terminé" end
rem ============================================================================ SUB Flocon_Koch() dim_local i Position_XY(-200,100 ) : Turn_Right(90) while i < 3 PUSH(4) : Koch() : TURN_Right(120) : i = i + 1 end_while END_SUB
rem ============================================================================ SUB Courbe_Dragon(c,n) Origine():Position_XY(-300,0 ) PUSH(c):PUSH(n):PUSH(1) : Dragon() Origine():Position_XY(400,0 ) : CAP(0) PUSH(c):PUSH(n):PUSH(-1) : Dragon() END_SUB
rem ============================================================================ SUB Koch() IF VARIABLE("iterations")=0 THEN DIM iterations IF EXIT_RECURSE=1 THEN EXIT_SUB POP(0) : iterations = POP_return if iterations = 0 forward(5) else PUSH(iterations - 1) : Koch() Turn_Left(60) : PUSH(iterations - 1) : Koch() Turn_right(120) : PUSH(iterations - 1) : Koch() Turn_Left(60) : PUSH(iterations - 1) : Koch() end_if CLR() : POP(0): iterations = POP_RETURN END_SUB
rem ============================================================================ SUB Dragon() IF VARIABLE("Drag_c")=0 THEN DIM Drag_c,Drag_n,Drag_e IF EXIT_RECURSE=1 THEN EXIT_SUB POP(2): Drag_c = POP_return POP(1): Drag_n = POP_return POP(0): Drag_e = POP_return IF Drag_n>0 PUSH(Drag_c/SQR(2)):PUSH(Drag_n-1):PUSH(1) : Dragon() TG(90*Drag_e) PUSH(Drag_c/SQR(2)):PUSH(Drag_n-1):PUSH(-1): Dragon() ELSE AV(Drag_c) END_IF CLR():CLR():CLR() POP(2):Drag_c = POP_return POP(1):Drag_n = POP_return POP(0):Drag_e = POP_return END_SUB
rem ============================================================================ ' Astuce de Nardo26 SUB PUSH(v) IF VARIABLE("PILE")=0 DIM PILE: PILE = NUMBER_OBJECTS + 1 : DLIST PILE DIM EXIT_RECURSE : EXIT_RECURSE=0 END_IF ITEM_ADD PILE,v IF INKEY$<>"" THEN EXIT_RECURSE=1:CLEAR PILE: EXIT_SUB WAIT 1 : ' pour éviter de saturer l'UC END_SUB
SUB POP(n) IF VARIABLE("POP_return")=0 THEN DIM POP_return IF COUNT(PILE)<>0 THEN POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE)-n)) 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 ============================================
| |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Les routines Tortue Mar 30 Juin 2015 - 0:11 | |
| Bravo Nardo, mais essayes de trouver une astuce pour les couleurs ? | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Mar 30 Juin 2015 - 0:16 | |
| Heuuuu... les couleurs, c'est pas trop mon truc. Tu veux pas essayer toi ? je suis sûr qu'avec le flocon tu dois bien arrivé à faire quelque chose de sympa ! | |
| | | 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 Mar 30 Juin 2015 - 1:34 | |
| Bravo Nardo26. Bien réussi. Le coloriste officiel du forum a boudé la colorisation. Quel dommage ! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Mar 30 Juin 2015 - 2:12 | |
| Normal, avec la récursivité, il est retombé 20 ans en arriere !! à l'époque, il ne maitrisait pas encore les couleurs | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Les routines Tortue Mar 30 Juin 2015 - 3:43 | |
| Hello Papydall ! Suite à mes cogitations, j'en suis arrivé à cette version du flocon de Koch. Comme il n'y a pas de variable locale... C'est beaucoup plus simple ainsi : - Code:
-
rem ============================================================================ SUB Flocon_Koch() dim_local i Position_XY(-200,100 ) : Turn_Right(90) while i < 3 Koch(4) : TURN_Right(120) : i = i + 1 end_while END_SUB
rem ============================================================================ SUB Koch(iterations) IF VARIABLE("iterations")=0 THEN DIM iterations PUSH(iterations) if iterations = 0 forward(5) else Koch(iterations - 1) Turn_Left(60) : Koch(iterations - 1) Turn_right(120) : Koch(iterations - 1) Turn_Left(60) : Koch(iterations - 1) end_if CLR() : POP(0): iterations = POP_RETURN END_SUB
| |
| | | 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 Mar 30 Juin 2015 - 5:16 | |
| Et du coup, on peut remettre le paramètre Flocon_Koch(n) - Code:
-
Init_Turtle() Flocon_Koch(4) end rem ============================================================================ SUB Flocon_Koch(n) dim_local i Position_XY(-200,100 ) : Turn_Right(90) while i < 3 Koch(n) : TURN_Right(120) : i = i + 1 end_while END_SUB
rem ============================================================================ SUB Koch(iterations) IF VARIABLE("iterations")=0 THEN DIM iterations PUSH(iterations) if iterations = 0 forward(5) else Koch(iterations - 1) Turn_Left(60) : Koch(iterations - 1) Turn_right(120) : Koch(iterations - 1) Turn_Left(60) : Koch(iterations - 1) end_if CLR() : POP(0): iterations = POP_RETURN END_SUB rem ============================================================================= rem ============================================================================ rem Spécifiques aux traitements récursifs rem ============================================================================ SUB PUSH(v) IF VARIABLE("PILE")=0 DIM PILE: PILE = NUMBER_OBJECTS + 1 : DLIST PILE DIM EXIT_RECURSE : EXIT_RECURSE=0 END_IF ITEM_ADD PILE,v IF INKEY$<>"" THEN EXIT_RECURSE=1:CLEAR PILE: EXIT_SUB WAIT 1 : ' pour éviter de saturer l'UC END_SUB
SUB POP(n) IF VARIABLE("POP_return")=0 THEN DIM POP_return IF COUNT(PILE) > n THEN POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE)-n)) 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 ============================================
| |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Les routines Tortue Mar 30 Juin 2015 - 7:13 | |
| Allez ! En couleur - Code:
-
rem ============================================================================ Init_Turtle() : ' Indispensable ' Votre programme débute ici
Flocon_Koch() Courbe_Dragon(200,10)
caption 0,"terminé" end
rem ============================================================================ SUB Flocon_Koch() dim_local i Position_XY(-200,100 ) : Turn_Right(90) while i < 3 PUSH(4) : Koch() : TURN_Right(120) : i = i + 1 end_while END_SUB
rem ============================================================================ SUB Courbe_Dragon(c,n) Origine():Position_XY(-300,0 ) PUSH(c):PUSH(n):PUSH(1) : Dragon() Origine():Position_XY(400,0 ) : CAP(0) PUSH(c):PUSH(n):PUSH(-1) : Dragon() END_SUB
rem ============================================================================ SUB Koch() IF VARIABLE("iterations")=0 THEN DIM iterations IF EXIT_RECURSE=1 THEN EXIT_SUB POP(0) : iterations = POP_return if iterations = 0 forward(5) else PUSH(iterations - 1) : Koch() Turn_Left(60) : PUSH(iterations - 1) : Koch() Turn_right(120) : PUSH(iterations - 1) : Koch() Turn_Left(60) : PUSH(iterations - 1) : Koch() end_if CLR() : POP(0): iterations = POP_RETURN END_SUB
rem ============================================================================ SUB Dragon() IF VARIABLE("Drag_c")=0 THEN DIM Drag_c,Drag_n,Drag_e IF EXIT_RECURSE=1 THEN EXIT_SUB POP(2): Drag_c = POP_return POP(1): Drag_n = POP_return POP(0): Drag_e = POP_return IF Drag_n>0 PUSH(Drag_c/SQR(2)):PUSH(Drag_n-1):PUSH(1) : Dragon() TG(90*Drag_e) PUSH(Drag_c/SQR(2)):PUSH(Drag_n-1):PUSH(-1): Dragon() ELSE AV(Drag_c) END_IF CLR():CLR():CLR() POP(2):Drag_c = POP_return POP(1):Drag_n = POP_return POP(0):Drag_e = POP_return END_SUB
rem ============================================================================ ' Astuce de Nardo26 SUB PUSH(v) CouleurCrayon(rnd(255),rnd(255),rnd(255)) IF VARIABLE("PILE")=0 DIM PILE: PILE = NUMBER_OBJECTS + 1 : DLIST PILE DIM EXIT_RECURSE : EXIT_RECURSE=0 END_IF ITEM_ADD PILE,v IF INKEY$<>"" THEN EXIT_RECURSE=1:CLEAR PILE: EXIT_SUB WAIT 1 : ' pour éviter de saturer l'UC END_SUB
SUB POP(n) IF VARIABLE("POP_return")=0 THEN DIM POP_return IF COUNT(PILE)<>0 THEN POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE)-n)) 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 ============================================ | |
| | | 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
| |
| |
| |