FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» I Love You
par JL35 Hier à 16:25

» MARK_ON déclenche un événement ON_CLICK à la place de ...
par Jean Claude Mer 18 Oct 2017 - 18:08

» mise a jour calculatrice
par joeeee2017 Mer 18 Oct 2017 - 15:57

» [solved] 3D_LINE How to ?
par Jicehel Mer 18 Oct 2017 - 11:01

» Convertisseur de base 10 de 2 à 36
par gigi75 Mar 17 Oct 2017 - 18:49

» calculatrice avec touches movibles
par joeeee2017 Dim 15 Oct 2017 - 1:11

» CORTANA
par gigi75 Sam 14 Oct 2017 - 16:32

» Calculatrice
par Jean Claude Sam 14 Oct 2017 - 12:30

» Compilateur FBPano
par jean_debord Jeu 12 Oct 2017 - 9:53

» KGF_dll - nouvelles versions
par Klaus Mar 10 Oct 2017 - 18:49

» à propos de Panoramic_Editor [Résolu]
par Klaus Mar 10 Oct 2017 - 3:19

» Un petit "coucou" à tous les Panoramiciens !
par Jack Ven 6 Oct 2017 - 10:24

» Pourquoi le compilateur stagne
par mindstorm Mer 4 Oct 2017 - 20:38

» Panoramic ?
par Marc37 Mer 4 Oct 2017 - 0:39

» Premiers pas avec Arduino
par Marc37 Mer 4 Oct 2017 - 0:29

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Octobre 2017
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Les routines Tortue

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3  Suivant
AuteurMessage
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 19: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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 20: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)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 20:08

Oups !
Oui, un oubli de ma part... Wink

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... Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Sam 27 Juin 2015 - 2: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 ============================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Sam 27 Juin 2015 - 3:04

PapyDall !

J'essaye de réaliser un flocon de Von-Koch en récursif mais pour l'instant je coince un peu... Wink
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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Les routines Tortue   Sam 27 Juin 2015 - 8: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 ============================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Sam 27 Juin 2015 - 16:09

Bon je dois être un peu maso de passer du temps sur ceci quand on voit le résultat final... Laughing
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:
 
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Yannick

avatar

Nombre de messages : 7994
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Sam 27 Juin 2015 - 17: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...
lol!

Désolé, j' ai pas pu m' en empêcher... fallait bien qu' il y en ait un qui la fasse ...Embarassed
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Sam 27 Juin 2015 - 17: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 !! drunken
Voir ici : https://fr.wikipedia.org/wiki/Brainfuck#Ook.21

@Papydall : la commande DrawAxis() te fait perdre la position de la tortue...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Yannick

avatar

Nombre de messages : 7994
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Sam 27 Juin 2015 - 19: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.
lol!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Dim 28 Juin 2015 - 2: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é!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Dim 28 Juin 2015 - 4: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... Wink

PS: ils ne gagneront pas...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Dim 28 Juin 2015 - 5:20

@Nardo26

Non, ils ne gagneront pas... J'en suis convaincu.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Parpaiun

avatar

Nombre de messages : 192
Age : 78
Localisation : HERAULT
Date d'inscription : 15/04/2015

MessageSujet: Revue du sujet   Dim 28 Juin 2015 - 11: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 ! lol!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Dim 28 Juin 2015 - 13: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... Rolling Eyes
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Dim 28 Juin 2015 - 19: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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Dim 28 Juin 2015 - 23:34

Le résultat est superbe !

La fougère est un peu long à se dessiner mais le résultat est
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 0: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 ============================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

Nombre de messages : 5858
Age : 45
Localisation : 77500
Date d'inscription : 19/04/2011

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 1:11

Bravo Nardo, mais essayes de trouver une astuce pour les couleurs ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 1: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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 2:34

Bravo Nardo26.
Bien réussi.

Le coloriste officiel du forum a boudé la colorisation. Quel dommage ! Sad
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 3:12


Normal, avec la récursivité, il est retombé 20 ans en arriere !!
à l'époque, il ne maitrisait pas encore les couleurs
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Nardo26

avatar

Nombre de messages : 2294
Age : 49
Localisation : Valence
Date d'inscription : 02/07/2010

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 4: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
papydall

avatar

Nombre de messages : 5546
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 6: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 ============================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jean Claude

avatar

Nombre de messages : 5040
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Les routines Tortue   Mar 30 Juin 2015 - 8: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 ============================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Les routines Tortue   

Revenir en haut Aller en bas
 
Les routines Tortue
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 2 sur 3Aller à la page : Précédent  1, 2, 3  Suivant
 Sujets similaires
-
» Dame Tortue
» [résolu]Session laguée sous Windows 7
» C'est l'histoire d'une tortue, qui se tord et qui se tue ? Euphemia
» Quand la mouse tachée bricole...
» Aki' la tortue

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: