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
» Immortaliser les photos de famille
par Jean Claude Hier à 21:24

» Concours de Morpions
par jjn4 Hier à 16:34

» Tout est tranquille
par Jean Claude Ven 22 Sep 2017 - 21:41

» Texte en gif animé
par JL35 Ven 22 Sep 2017 - 13:29

» BasicEditor
par Yannick Mer 20 Sep 2017 - 17:17

» Simuler l’appui d'une touche ou combinaison de touches.
par pascal10000 Lun 18 Sep 2017 - 19:30

» Utilisation de HVIEWER pour afficher des images
par papydall Lun 18 Sep 2017 - 17:43

» Panoramic et les gifs animés.
par papydall Lun 18 Sep 2017 - 16:32

» recover source
par pascal10000 Dim 17 Sep 2017 - 14:21

» Recent dans vos menu
par Jean Claude Sam 16 Sep 2017 - 11:41

» Comment centrer un texte 3D.
par pascal10000 Ven 15 Sep 2017 - 20:20

» Carte interface 16 entrées et 16 sorties
par Jicehel Ven 15 Sep 2017 - 16:30

» Version instantanée V 0.9.28i9 possédant l'objet SYNEDIT
par pascal10000 Ven 15 Sep 2017 - 16:20

» Compilateur FBPano
par jean_debord Ven 15 Sep 2017 - 9:59

» 1 (en analyse): 3D_TARGET_IS ne fonctionne pas sur 3D_TEXT
par Jack Jeu 14 Sep 2017 - 19:52

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2017
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier

Partagez | 
 

 Les routines Tortue

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

avatar

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

MessageSujet: Les routines Tortue   Ven 26 Juin 2015 - 14:53

Vous avez  peut-être connu le langage LOGO où il est question de sa célèbre tortue ?
Certains langages  possèdent aussi des routines tortue pour dessiner diverses figures géométriques / artistiques.

La tortue possède un crayon qui peut être baissé (les déplacements de la tortue laissent des traces) ou levé (la tortue ne laisse pas de traces lors de ses déplacements).
La tortue connaît comment exécuter des ordres du genre AVANCE(pas), RECULE(pas), GAUCHE(angle), DROITE(angle) et beaucoup d’autres commandes.
Ça permet d’obtenir des belles figures très facilement.  

J’ai codé (en Panoramic) les routines tortue qui vous permettront de découvrir vos talents d’artiste !
Ce sont des procédures rassemblées dans un fichier Include_Turtle.bas que vous pouvez inclure dans vos programmes.

Bonus : les angles que vous utilisez sont en degré (plus intuitif pour certains que les Radians!)

Un programme type qui exploite les routines de Include_Turtle.bas a la structure suivante :

Code:

rem ============================================================================
rem     Utilisation de Include_Turtle.bas
rem          Auteur : Papydall
rem ============================================================================
Init_Turtle()  : ' Indispensable
' Votre programme débute ici

end  : ' fin de votre programme
rem ============================================================================
' Vos procédures ici
'
'
' Fin de vos procédures
rem ============================================================================
'   !!!!!   LA COMMANDE A NE PAS OUBLIER      !!!!!
#Include "Include_Turtle.bas"
rem =========================== FIN ============================================


Exemple pour tracer un rectangle de longueur LONG et de largeur LARG
Code:

 SUB Rectangle(long,larg)
    dim_local i
    for i = 1 to 2 : AV(larg) : TD(90) : AV(long) : TD(90) : next i
END_SUB

Appel : Rectangle(200,100) < ---------- tracer un rectangle à partir de la position actuelle de la tortue.

Si on veut que notre rectangle soit tracé en oblique et non à l’horizontale (c’est un peut laborieux à faire sans passer par les routines tortue), il suffit de changer tout d’abord le cap de la tortue et appeler ensuite la procédure Rectangle.

Code:

SUB Rectangle_Oblique(ang,long,larg)
    Cap(ang) : Rectangle(long,larg)
END_SUB

Appel :  Rectangle_Oblique(45,300,100)       < ---------- tracer un rectangle oblique(45° avec l’horizontale, de 300pixels /sur 200 pixels) à partir de la position actuelle de la tortue.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
papydall

avatar

Nombre de messages : 5531
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 - 14:57

Maintenant, voici le fichier Include_Turtle.bas.
Le code est suffisamment documenté (lignes REM).
Les ordres/commandes donnés à la tortue ont trois syntaxes : en français, en abrégé et en anglais.
Par exemple : la commande qui fait avancer la tortue de pas pixels peut se coder :
AVANCE(pas)  < ----- en français
AV(pas) en abrégé
FORWARD(pas) en anglais
Ces trois syntaxes produisent toutes le même résultat.

Code:

rem ============================================================================
rem     Include_Turtle.bas
rem     Auteur : Papydall
rem ============================================================================

rem ############################################################################
rem ============================================================================
rem                    LES PROCEDURES DE LA TORTUE
rem ============================================================================
rem ############################################################################
rem Les variables globales Turtle_XXX sont prédéfinies pour les routines TORTUE.
rem Votre programme ne doit ni les redéfinir ni les modifier.
rem Ce sont :
rem Turtle_Xorigine,Turtle_Yorigine : coordonnées de l origine (le centre de l écran)
rem Turtle_X,Turtle_Y : coordonnées relatives de la tortue (par rapport à l origine)
rem Turtle_Heading : direction initiale du déplacement de la tortue : vers le haut
rem Turtle_PI  : la constante Pi
rem Turtle_rad : multiplicateur pour transformer les degrés en radians
rem ============================================================================
rem REMARQUE IMPORTANTE :
rem L origine des axes est le centre de la fenêtre
rem Le sens positif sur l axe des X est dirigé vers la droite (négatif vers la gauche)
rem Le sens positif sur l axe des Y est dirigé vers le haut (négatif vers le bas)
rem ============================================================================
' Initialisation de la tortue graphique
' La tortue se trouve au centre de la fénêtre et est dirigée vers le Nord (cap 0)
SUB Init_Turtle()
    dim Turtle_Xorigine,Turtle_Yorigine :' coordonnées de l'origine (le centre de l'écran)
    dim Turtle_X,Turtle_Y : ' coordonnées relatives de la tortue (par rapport à l'origine)
    dim Turtle_Heading    : ' direction initiale du déplacement de la tortue vers le haut
    dim New_Turtle_Heading: ' Nouveau cap de la tortue
    dim Turtle_PI         : ' la constante Pi
    dim Turtle_rad        : ' multiplicateur pour transformer les degrés en radians
    dim Turtle_PR, Turtle_PG, Turtle_PB : ' RGB du tracé
    dim Turtle_FR, Turtle_FG, Turtle_FB : ' RGB du fond
    dim Turtle_Flood_R, Turtle_Flood_G, Turtle_Flood_B : ' RGB du remplissage
    dim Turtle_R, Turtle_G,Turtle_B : ' RGB
    dim Turtle_Pen_Up_Down  : ' Etat du crayon (0 = baissé) ; (1 = levé)
    dim Turtle_Return_value : ' Valeur de retour d'une SUB exploitée comme une fonction
' ------------------------------------------------------------------------------
    full_space 0   : ' Utiliser tout l'écran
    Turtle_Pen_Up_Down = 0           : ' crayon baissé au départ
    Turtle_Xorigine = width(0)/2     : ' L'origine de ...
    Turtle_Yorigine = height(0)/2-20 : ' ... l'écran graphique
    Turtle_PI  = acos(-1)      : ' pi
    Turtle_Heading = Turtle_PI/2   : ' La tortue est dirigée vers le haut
    Turtle_rad = Turtle_PI/180 : ' Facteur multiplicateur pour les angles (degrés --> radians)

    Nouveau()                  : ' Pour débuter un nouveau dessin
END_SUB
rem ============================================================================
rem ============================================================================
' Pour débuter un nouveau dessin
' Effacer l'écran et remettre la tortue à sa place
' (au centre de la fenêtre et dirigée vers le nord)
SUB Nouveau()
    cls : Origine()
END_SUB
rem ============================================================================
' Ramener la tortue à l'origine (c-à-d au centre de la fenêtre)
' Ce qui est déjà tracé n'est pas effacé.
SUB Origine()
    CouleurCrayon(255,255,255) : ' Tracé en blanc
    CouleurFond(0,0,0)         : ' Fond noir
    Turtle_X = Turtle_Xorigine : Turtle_Y = Turtle_Yorigine
    2d_poly_from Turtle_X,Turtle_Y
    New_Turtle_Heading = Turtle_Heading
END_SUB
rem ============================================================================
' Avancer de pas pixels
' Si le crayon est baissé (Pen_Down), la tortue trace un trait avec la couleur en cours
' Si le crayon est levé (Pen_Up), la tortue se déplace sans laisser de trace
SUB Avance(pas)
    dim_local x1,y1,x2,y2,a
    x1 = Turtle_X : y1 = Turtle_Y : a  = New_Turtle_Heading
    x2 = Turtle_X + pas * cos(a)  : y2 = Turtle_Y - pas * sin(a)

    if Turtle_Pen_Up_Down = 0 : ' crayon baissé ?
       2d_poly_to x2,y2       : ' on trace le trait avec la couleur en cours
    else                      : ' crayon levé
       2d_poly_from x2,y2     : ' on se déplace sans trace
    end_if
    Turtle_X = x2 : Turtle_Y = y2  : ' Mise à jour des variables

END_SUB
rem ============================================================================
' Réculer de pas pixels
' Si le crayon est baissé (Pen_Down), la tortue trace un trait avec la couleur en cours
' Si le crayon est levé (Pen_Up), la tortue se déplace sans laisser de trace
SUB Recule(pas)
    Avance(0-pas)
END_SUB
rem ============================================================================
' Tourner à gauche (sens trigonométrique) de a degrés
SUB Gauche(a)
    New_Turtle_Heading = New_Turtle_Heading + a * Turtle_rad
END_SUB
rem ============================================================================
' Tourner à droite (sens horaire) de a degrés
SUB Droite(a)
    New_Turtle_Heading = New_Turtle_Heading - a * Turtle_rad
END_SUB
rem ============================================================================
' Fixer le Cap de la tortue de manière absolue selon l'angle de a degrés
' Le Cap est la direction du déplacement de la tortue :

' 0   c'est vers le haut (NORD)
' 90  c'est vers la droite (EST)
' 180 c'est vers le bas (SUD)
' 270 c'est vers la gauche (OUEST)
' 360 c'est identique à 000
SUB Cap(a)
    New_Turtle_Heading = Turtle_Heading + a * Turtle_rad
END_SUB
rem ============================================================================
' Fixer la position X de la tortue par rapport à l'origine
' Déplacement horizontal
SUB Pos_X(n)
    Turtle_X = Turtle_Xorigine + n : 2d_poly_from Turtle_X,Turtle_Y
END_SUB
rem ============================================================================
' Fixer la position Y de la tortue par rapport à l'origine
' Déplacement vertical
rem ############################################################################
rem   REMARQUE IMPORTANTE : le sens posif pour les Y est le sens vers le haut
rem ############################################################################
SUB Pos_Y(n)
    Turtle_Y = Turtle_Yorigine - n : 2d_poly_from Turtle_X,Turtle_Y
END_SUB
rem ============================================================================
' Fixer la position de la tortue
' Déplacer la tortue au point (X,Y) par rapport au centre de la
' fenêtre qui est l'origine.
' X et/ou Y peuvent être positives, négatives ou nules
SUB Position_XY(x,y)
    Turtle_X = Turtle_Xorigine + x : Turtle_Y = Turtle_Yorigine - y
    2d_poly_from Turtle_X,Turtle_Y
END_SUB
rem ============================================================================
' Tracer l'axe des X
SUB DrawAxisX()
    2d_line 0,Turtle_Yorigine,2*Turtle_Xorigine,Turtle_Yorigine
END_SUB
rem ============================================================================
' Tracer l'axe des Y
SUB DrawAxisY()
    2d_line Turtle_Xorigine,0,Turtle_Xorigine,2*Turtle_Yorigine
END_SUB
rem ============================================================================
' Tracer les 2 axes X et Y
SUB DrawAxis()
    DrawAxisX() : DrawAxisY()
END_SUB
rem ============================================================================
' On modifie l'état du crayon
' Lever le stylo : le déplacement de la tortue ne laisse pas de trace
SUB LeveCrayon()
    Turtle_Pen_Up_Down = 1
END_SUB
rem ============================================================================
' On modifie l'état du crayon
' Baisser le stylo : le déplacement de la tortue laisse une trace
SUB BaisseCrayon()
    Turtle_Pen_Up_Down = 0
END_SUB
rem ============================================================================
' Fixer la couleur du tracé
SUB CouleurCrayon(r,g,b)
    Turtle_PR = R : Turtle_PG = G :Turtle_PB = B
    2d_pen_color Turtle_PR, Turtle_PG, Turtle_PB
END_SUB
rem ============================================================================
' Fixer la couleur du fond
SUB CouleurFond(r,g,b)
    Turtle_FR =  R :  Turtle_FG = G :  Turtle_FB = B
    color 0, Turtle_FR, Turtle_FG, Turtle_FB
END_SUB
rem ============================================================================
' Gomme : La tortue efface tous les traits qu’elle rencontre
SUB Gomme()
    2d_pen_color Turtle_FR, Turtle_FG, Turtle_FB
END_SUB
rem ============================================================================
' Inverser la couleur du crayon
SUB InverseCrayon()
    2d_pen_color 255 - Turtle_PR, 255 - Turtle_PG, 255 - Turtle_PB
END_SUB
rem ============================================================================
' Remplissage de la zone où se trouve la tortue avec la couleur transmise en
' paramètres r,g,b
SUB Colorie(r,g,b)
    Turtle_Flood_R = R :  Turtle_Flood_G = G : Turtle_Flood_B = B
    2d_flood Turtle_X, Turtle_Y, Turtle_Flood_R, Turtle_Flood_G, Turtle_Flood_B
END_SUB
rem ============================================================================
' Tracer un cercle de rayon r centré à la position de la tortue
SUB Disque(r)
    2D_FILL_OFF : 2d_circle Turtle_X,Turtle_Y,r
END_SUB
rem ============================================================================
' Tracer une ellipse de demi-axes Rx et Ry centrée à la position de la tortue
SUB Ovale(Rx,Ry)
    dim_local i,x,y
    2d_poly_from Turtle_X + Rx, Turtle_Y
    for i = 0 to 360
        x = Turtle_X + Rx*cos(i*Turtle_Rad) : y = Turtle_Y + Ry*sin(i*Turtle_Rad)
        2d_poly_to x,y
    next i
END_SUB
rem ============================================================================
' Le cercle orthoptique de l'ellipse est l'ensemble des points qui "regardent"
' l'ellipse suivant un angle droit, c-à-d dont partent deux tagentes à l'ellipse
' perpendiculaires.
' Ce cercle a le même centre que l'ellipse et son rayon vaut sqr(Rx*Rx + Ry*Ry)
SUB Cercle_Orthoptique(Rx,Ry)
    dim_local r
    r = sqr(Rx*Rx + Ry*Ry)
    2D_FILL_OFF : 2d_circle Turtle_X,Turtle_Y,r
END_SUB
rem ============================================================================
' Calculer la distance entre le centre de l'ellipse et l'un de ses foyers
SUB Distance_Centre_Ellipse_O_Foyer(Rx,Ry)
    Turtle_Return_value = sqr(abs(Rx*Rx - Ry*Ry))
END_SUB
rem ============================================================================
' Calculer l'excentricité de l'ellipse.
' L'exentricité de l'ellipse exprime l'écart de forme entre l'ellipse et le
' cercle parfait dont l'excentricité est nulle.
SUB Excentricite_Ellipse(Rx,Ry)
    dim_local c,e
    Distance_Centre_Ellipse_O_Foyer(Rx,Ry) : c = Turtle_Return_value : e = c/Rx
    Turtle_Return_value = e
END_SUB
rem ============================================================================
rem ############################################################################
' Routines en abrégé
rem ============================================================================
SUB AV(pas)
    Avance(pas)
END_SUB
rem ============================================================================
SUB RE(pas)
    Recule(pas)
END_SUB
rem ============================================================================
SUB TG(a)
    Gauche(a)
END_SUB
rem ============================================================================
SUB TD(a)
    Droite(a)
END_SUB
rem ============================================================================
SUB LC()
    LeveCrayon()
END_SUB
rem ============================================================================
SUB BC()
    BaisseCrayon()
END_SUB
rem ============================================================================
SUB CC(r,g,b)
    CouleurCrayon(r,g,b)
END_SUB
rem ============================================================================
SUB CF(r,g,b)
    CouleurFond(r,g,b)
END_SUB
rem ============================================================================
SUB GO()
    Gomme()
END_SUB
rem ============================================================================
SUB IC()
    InverseCrayon()
END_SUB
rem ============================================================================
SUB CO(r,g,b)
    Colorie(r,g,b)
END_SUB
rem ============================================================================
SUB DI(r)
    Disque(r)
END_SUB
rem ============================================================================
SUB OV(Rx,Ry)
    Ovale(Rx,Ry)
END_SUB
rem ============================================================================

' Anglais

rem ============================================================================
rem ############################################################################
rem ============================================================================

SUB Forward(pas)
    Avance(pas)
END_SUB
rem ============================================================================
SUB Back(pas)
    Recule(pas)
END_SUB
rem ============================================================================
SUB Turn_Left(a)
    Gauche(a)
END_SUB
rem ============================================================================
SUB Turn_Right(a)
    Droite(a)
END_SUB
rem ============================================================================
SUB Set_Heading(a)
    Cap(a)
END_SUB
rem ============================================================================
SUB Pen_Up()
    LeveCrayon()
END_SUB
rem ============================================================================
SUB Pen_Down()
    BaisseCrayon()
END_SUB
rem ============================================================================
SUB Set_Pen_Color(r,g,b)
    CouleurCrayon(r,g,b)
END_SUB
rem ============================================================================
SUB Set_BG_Color(r,g,b)
    CouleurFond(r,g,b)
END_SUB
rem ============================================================================
SUB Pen_Erase()
    Gomme()
END_SUB
rem ============================================================================
SUB Pen_Invert()
    InverseCrayon()
END_SUB
rem ============================================================================
SUB Pen_Paint(r,g,b)
    CO(r,g,b)
END_SUB
rem ============================================================================
SUB Draw_circle(r)
    Disque(r)
END_SUB
rem ============================================================================
SUB Draw_Ellipse(Rx,Ry)
    Ovale(Rx,Ry)
END_SUB
rem ============================================================================
SUB Draw_Cercle_Orthoptique(Rx,Ry)
    Cercle_Orthoptique(Rx,Ry)
END_SUB
rem ============================================================================
rem ############### FIN DU FICHIER #############################################
rem ============================================================================


Un exemple d'utilisation de Include_Turtle.bas

Code:

rem ============================================================================
rem     Exemple d utilisation de
rem        Include_Turtle.bas
rem        Auteur : Papydall
rem ============================================================================
Init_Turtle()  : ' Indispensable
' Votre programme débute ici
label fin
caption 0,"Veuiller patienter ...... <CLICK> Pour arrêter"
alpha 10 : top 10,100 : left 10,20 : font_size 10,20 : font_bold 10 : font_color 10,255,255,0
on_click 0,fin
Nouveau() : Bouquet_Fleurs()  : pause 1000
Nouveau() : Spirale() : pause 1000
Nouveau() : Set_BG_Color(0,0,255) :  Set_Pen_Color(0,255,0) : Figure(108,10) : pause 1000
Nouveau() : Directions()     : pause 1000
Nouveau() : Demo_1()         : pause 1000
Nouveau() : Demo_2()         : pause 1000
Nouveau() : Demo_3()         : pause 1000
Nouveau() : Demo_Truc()      : pause 1000
Nouveau() : Demo_Ellipse()
print_locate Turtle_Xorigine/2 ,10
print "Cercle orthoptique de l'ellipse en rouge"
print_locate Turtle_Xorigine/2 ,30
print "Cercle principale de l'ellipse en vert  "
print_locate Turtle_Xorigine/2 ,50
print "Cercle secondaire de l'ellipse en jaune " : pause 5000
Nouveau() : Fleurs_Aleatoires() : pause 1000
Nouveau() : Test_1()            : pause 1000
Nouveau() : DrawAxis()          : pause 1000
Nouveau() : Village()           : pause 1000
Nouveau() : Rosace()            : pause 1000
Nouveau() : Fleur()             : pause 1000
Nouveau() : Trois_Bouquets()
caption 10,"Fin du spactacle"
caption 0,"Terminé"
end
' Fin de votre programme
rem ============================================================================
' Vos procédures commencent ici
SUB Spirale()
   dim_local n
   Set_Pen_Color(255,175,175)
   Pos_X(-200)
   for n = 1 to 360 : Turn_Right(6) :  Carre(n/2)  : next n
   Pos_X(200)
   for n = 1 to 380 : Turn_Left(6)  :  Carre(n/2)  : next n
END_SUB
' ------------------------------------------------------------------------------
SUB Carre(c)
   dim_local i
   for i = 1 to 4 : Forward(c) : Turn_Right(90) : next i
END_SUB
rem ============================================================================
SUB Cercle(pas,taille)
   dim_local i
   for i = 1 to pas : Turn_Right(360/pas) : Forward(taille) : next i
END_SUB
' ------------------------------------------------------------------------------
SUB Figure(pas,taille)
   dim_local i
   for i = 1 to pas : Turn_Right(360/pas) : Cercle(pas,taille) : next i
END_SUB
rem ============================================================================
rem ############################################################################
SUB Bouquet_Fleurs()
   Set_BG_Color(0,0,0) : Set_Pen_Color(255,255,255) : Pen_UP()
   Back(150) : Base() : Bunch()
END_SUB
' ------------------------------------------------------------------------------
' Arc de 90°
SUB Arch()
   dim_local i
   for i = 1 to 18 : Forward(4) : Turn_Right(5) : next i
END_SUB
' ------------------------------------------------------------------------------
SUB Oval()
   Turn_Left(45) : Arch() : Turn_Right(90) : Arch() :Turn_Right(135)
END_SUB
' ------------------------------------------------------------------------------
SUB Base()
   Turn_Right(90) : Back(30) : Pen_Down() : Set_Pen_Color(192,192,192) : Oval()
   Pen_Up() : Forward(30) : Turn_Left(90)
END_SUB
' ------------------------------------------------------------------------------
SUB Leaf()
   Set_Pen_Color(0,255,0) : Forward(24) : Oval() : Back(24)
END_SUB
' ------------------------------------------------------------------------------
SUB Section()
   Turn_Right(45) : Leaf() : Turn_Left(45)  : Forward(24)
   Turn_Left(45)  : Leaf() : Turn_Right(45) : Forward(24)
END_SUB
' ------------------------------------------------------------------------------
SUB Stem()
   dim_local i
   Set_Pen_Color(0,255,0) : Forward(48)
   for i = 1 to 3 : Section() : next i
   Pen_Up() : Forward(64) : Pen_Down()
END_SUB
' ------------------------------------------------------------------------------
SUB Petal()
   Set_Pen_Color(255,0,0) : Oval()
END_SUB
' ------------------------------------------------------------------------------
SUB Flower()
   dim_local i
   for i = 1 to 18
       Set_Pen_Color(255,255,0) : Forward(4) : Petal()
       Pen_Up() : Back(4) : Pen_Down() : Turn_Right(20)
   next i
END_SUB
' ------------------------------------------------------------------------------
SUB Plant()
   Stem() : Flower() : Pen_Up() : Back(256) : Pen_Down()
END_SUB
' ------------------------------------------------------------------------------
SUB Bunch()
   dim_local i
   Turn_Left(24) : Pen_Down()
   for i = 1 to 3 : Plant() : Turn_Right(24) : next i
END_SUB
rem ============================================================================
SUB Trois_Bouquets()
   Bouquet_Fleurs()
   Origine() : Pos_X(-400) : Bouquet_Fleurs()
   Origine() : Pos_X(400)  : Bouquet_Fleurs()
END_SUB
rem ============================================================================
SUB Demo_1()
   dim_local i
   Set_Pen_Color(0,255,255)
   for i = 1 to 2026 : Set_Heading(0-360*(power(i,3)/2026)) : Forward(10) : next i
END_SUB
rem ============================================================================
SUB Demo_2()
   dim_local i,j,k
   for i = 1 to 4
       for j = 1 to 8
           for k = 1 to 4 : Turn_Right(90) : Forward(105) : next k
           Back(105) : Turn_left(45)
       next j
       Turn_Left(90)
   next i
END_SUB
rem ============================================================================
SUB Demo_3()
   dim_local i,j
   Set_Bg_Color(0,0,0)
   Set_Pen_Color(255,175,175) : ' crayon Rose
   for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i
   Pen_Invert()         : ' crayon inverseur
   for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i
   Pen_Erase()          : ' crayon effaceur
   for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i
   Set_Pen_Color(0,0,255) : ' crayon bleu
   for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i
   Pen_Invert()      : ' crayon inverseur
   for i = 1 to 3600 : Forward(15) : Turn_Right(i+0.2) : next i
   Position_XY(-75,75) : Draw_circle(40) : Pen_Paint(255,0,0)
END_SUB
rem ============================================================================
SUB Demo_Truc()
   dim_local i
   for i = 4 to 12 step 4 : Nouveau() : Multi_Truc(i) : pause 1000 : next i
   for i = 8 to 1 step -4 : Nouveau() : Multi_Truc(i) : pause 1000 : next i
END_SUB
' =============================================================================
SUB Truc()
   Forward(200)    : Turn_Right(90) : Forward(100) : Turn_Left(90): Forward(50)
   Draw_Circle(10) : Pen_Paint(255,0,0)   : Back(100)
   Draw_Circle(10) : Pen_Paint(255,255,0) : Forward(50)  : Turn_Left(90)
   Forward(100)    : Turn_Right(90)       : Back(200)
END_SUB
' =============================================================================
SUB Multi_Truc(n)
   dim_local i,a
   a = 360/n : Set_Pen_Color(0,255,255)
   for i = 1 to n : Truc() : Turn_Right(a) : next i
END_SUB
rem ============================================================================
rem ============================================================================
' Tracer une flèche vers le haut
SUB Fleche()
   Forward(300) : Turn_Right(135)
   Forward(30)  : Back(30) : Turn_Left(270)
   Forward(30)  : Back(30) : Turn_Right(135) : Back(300)
END_SUB
' ------------------------------------------------------------------------------
SUB Directions()
   dim_local i
   for i = 1 to 16 : Fleche() : Turn_Right(360/16) : next i
END_SUB
rem ============================================================================
SUB Demo_Ellipse()
   Ovale(200,100)  : Pen_Paint(0,0,255)
   Ovale(100,200)  : Pen_Paint(0,255,0)
   Set_Pen_Color(255,0,0) : Draw_Cercle_Orthoptique(200,100)
   Set_Pen_Color(0,255,0) : Disque(200)
   Set_Pen_Color(0,255,255) : Disque(100) : Colorie(255,255,0)
END_SUB
rem ============================================================================
SUB Fleurs_Aleatoires()
   dim_local i
   CC(0,255,0) : LC()
   for i = 1 to 30  : flore() : next i
END_SUB
' ------------------------------------------------------------------------------
SUB Flore()
   dim_local x,y,t,n,d,i
   BC() : CC(rnd(255),rnd(255),rnd(255))
   x = 400-int(rnd(800)) : y = 300-int(rnd(600))
   t = int(rnd(360)) : d = 2 + int(rnd(9)) : n = 0
   for i = 1 to 72
       Position_XY(x,y) : Cap(n + t) : AV(40*(1+cos(d*n*Turtle_rad))) : n = n + 5
   next i
   LC()
END_SUB
rem ============================================================================
SUB Test_1()
   dim_local i,j
   for i = 1 to 2 : for j = 1 to 12 : AV(180) : TD(150) : next j : TD(180) : next i
END_SUB
rem ============================================================================
SUB Village()
   dim_local i
   BC() : TD(90) : AV(318) : RE(637) : TG(90)
   Maison(65) : Rue()
   Maison(45) : Rue() : Rue()
   Maison(55) : Rue()
   Maison(35) : Rue()
   Maison(75)
   for i = 1 to 6 : Rue() : next i
   Arbre()
   for i = 1 to 11 : Rue() : next i
   Arbre()
   LC() : Origine() : TG(90) : AV(270) : TD(90)
   AV(180) : Bc() : Soleil_1()
END_SUB
' ------------------------------------------------------------------------------
SUB Mur(t)
   dim_local i
   CC(255,0,0)
   for i = 1 to 4 : AV(t) : TD(90) : next i
   TD(30) : LC() : AV(15) : BC() : LC() : RE(15) : TG(30) : BC()   :' stop
END_SUB
' ------------------------------------------------------------------------------
SUB Toit(t)
   dim_local i
   CC(255,0,0)
   for i = 1 to 3 : AV(t) : TD(120) : next i
END_SUB
' ------------------------------------------------------------------------------
SUB Maison(t)
   Mur(t) : AV(t) : TD(30) : Toit(t)
   LC() : TG(30) : RE(t) : TD(90) : AV(t) : TG(90) : BC()
END_SUB
' ------------------------------------------------------------------------------
SUB Rue()
   LC() : TD(90) : AV(10) : TG(90) : BC()
END_SUB
' ------------------------------------------------------------------------------
SUB Tronc()
   dim_local i
   CC(153,102,0) : ' marron
   for i = 1 to 15 : AV(200) : RE(200) : TD(90) : AV(1)  : TG(90) : next i
END_SUB
' ------------------------------------------------------------------------------
SUB Feuille()
   Dim_local i
   CC(0,255,0)
   for i = 1 to 360 : AV(50) : RE(50) : TD(1) : next i
END_SUB
' ------------------------------------------------------------------------------
SUB Arbre()
   CC(153,102,0) : ' marron
   Tronc() : AV(180) : TG(90) : AV(8) : TD(45) :CC(0,255,0) : Feuille()
   LC() : Cap(0) : RE(180) : TD(90) : AV(8) : TG(90) :  BC()
END_SUB
' ------------------------------------------------------------------------------
SUB Soleil_1()
   dim_local i
   CC(255,255,0)
   for i = 1 to 360 : LC() : AV(40) : BC() : AV(1) : LC() : RE(41) : TD(1) : BC() : next i
   for i = 1 to 60 : LC() : AV(40) : BC() : AV(35) : LC() : RE(75) : TD(6) : BC() : next i
END_SUB
' ------------------------------------------------------------------------------
rem ============================================================================
SUB Arc(n)
   dim_local i
   for i = 1 to n : AV(3) : TD(1) : next i
END_SUB
' ------------------------------------------------------------------------------
SUB Rosace()
   Pos_X(-200)
   Arc(360) : TD(60)  : Arc(120) : TD(120) : ARC(120) : TD(120)
   ARC(120) : TD(60)  : ARC(60)  : TD(60)  : ARC(120) : TD(120)
   ARC(120) : TD(120) : ARC(120)
END_SUB
' ------------------------------------------------------------------------------
SUB Petale()
   Arc(90) : TD(90) : Arc(90) : TD(90)
END_SUB
' ------------------------------------------------------------------------------
SUB Fleur()
   dim_local i
   for i = 1 to 18 : Petale() : TD(360/18) : next i
END_SUB
rem ============================================================================

Fin:
 caption 0, "Programme arrêté par l'utilisateur"
 end

rem ============================================================================
' Fin des procédures
rem ============================================================================
'   !!!!!   LA COMMANDE A NE PAS OUBLIER      !!!!!
#Include "Include_Turtle.bas"
rem =========================== FIN ============================================


Dernière édition par papydall le Ven 26 Juin 2015 - 15:32, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jicehel

avatar

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

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 15:28

Génial, j'ai hâte de tester ça ce soir Wink Ca va me rappeler des souvenir et on se servait de ça même en BTS pour illustrer la récursivité par des tracés.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5531
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 - 15:37

Pour la récursivité, tu sais que Panoramic Interpréteur ne permet pas la récursivité et c’est dommage.
Panoramic Compilateur le permet parfaitement et j’ai obtenu des belles réalisations en utilisant la récursivité avec les Routines Tortue.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 15:56

Tu peux parfaitement obtenir une récursivité en Panoramic interprété, moyennant le respect de certaines règnes:
- toutes les variables (et je dis bien "toutes") doivent être remplacées par des DLIST
- en entrée dans une SUB, on crée une nouvelle "instance" de chaque variable dans la DLIST, au lieu d'utiliser DIM ou DIM_LOCAL. On crée une telle instance en plaçant la valeur par défaut dans la DLIST par ITEM_ADD ("0" pour un entier ou un flottant, et "" pour une chaîne de caractères)
- en sortant d'une SUB, il faut supprimer l'instance de la variable en faisant ITEM_DELETE n%,COUNT(n%)
- il faut utiliser ces variables uniquement sous forme d'expressions avec ITEM_READ$(n%,COUNT(n%))

Ainsi, on a une totale indépendance et et le code de la SUB devient "réentrant" comme on dit entre informaticiens, c'est-à-dire on peut l'appeler à nouveau en cours d'exécution. On peut avoir ainsi une récursivité réelle, directe (la procédure s'appelle elle-même) ou indirecte (la procedure en appelle une autre qui ... et qui appelle la procédure initiale).

Bon, j'en conviens, c'est lourd. En fait, c'est un exercice intellectuel que de concevoir de tels systèmes, mais ça marche ! Les DLIST sont vraiment magiques. Et comme pour un langage avec des procédures vraiment récursives, la profondeur est uniquement déterminée par la place en mémoire, pas par des considérations de programmation ou de langage.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
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 - 16:11

papydall a écrit:
Pour la récursivité, tu sais que Panoramic Interpréteur ne permet pas la récursivité et c’est dommage.
Panoramic Compilateur le permet parfaitement et j’ai obtenu des belles réalisations en utilisant la récursivité avec les Routines Tortue.
En cherchant bien, tu trouveras des exemples de recursivité réalisé en Panoramic...
Regarde sur mon site (les arbres binaires par exemple).
Comme dis Klaus, c'est un peu tordu, mais avec des DLIST (utilisé comme une pile) on y arrive très bien
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

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

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 16:17

Oui, je me souviens bien de tes arbres de décisions. J'ai failli m'en servir pour mon jeu de dames, mais je n'ai pas eu le courage de me casser assez la tête pour mettre en place la mécanique de raisonnement jusqu'au bout. Mais pour revenir au sujet de la tortue, je verrais si je mets en pratique ton mécanisme pour refaire des sapin et autres dessins basé sur la tortue et les appels récursifs. Pourquoi pas...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5531
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 - 16:29

Salut Klaus,Jicehel, Nardo26,
Salut tout le monde

Le code suivant, exécuté avec le compilateur
Code:

rem ============================================================================
rem     Utilisation de Include_Turtle.bas
rem          Auteur : Papydall
rem ============================================================================
Init_Turtle()  : ' Indispensable
' Votre programme débute ici
Arbre(350)
end  : ' fin de votre programme
rem ============================================================================
'  Procédure récursive de tracé d'un bel arbre
SUB Arbre(taille)
    if taille < 5
       forward(taille) : forward(0-taille)
    else
       forward(taille/3) : turn_left(30)  : Arbre(taille*2/3) : turn_right(30)
       forward(taille/6) : turn_right(25) : Arbre(taille/2)   : turn_left(25)
       forward(taille/3) : turn_right(25) : Arbre(taille/2)   : turn_left(25)
       forward(taille/6) : forward(0-taille)
    end_if
END_SUB
rem ============================================================================
'   !!!!!   LA COMMANDE A NE PAS OUBLIER      !!!!!
#Include "Include_Turtle.bas"
rem =========================== FIN ============================================

Produit l’image suivante.
Spoiler:
 

Tu veux bien maître Klaus indiquer exactement le code à utiliser pour obtenir le même résultat sous l'interpréteur ?  Laughing

Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 16:41

Je vais réfléchir sur ton code, Papydall. En attentant, voici la factorielle en récursivité:
Code:
dim fact%

fact(7)
message "5! = "+item_read$(1,count(1))
end

sub fact(n%)
  if object_exists(1)=0
    list 1
    item_add 1,"1"
  end_if
  if n%>1
    item_add 1,str$(val(item_read$(1,count(1))) * n%)
    fact(n%-1)
    display
  end_if
end_sub
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
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 - 16:42

Il est superbe ton exemple Papydall !
Bravo !!!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
papydall

avatar

Nombre de messages : 5531
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 - 16:49

@Nardo26
Avec les routines tortue, on peut obtenir des meilleurs !

Merci Klaus pour l’exemple.
Rectif d'une erreur de frappe : message "7! = .... au lieu de 5
J’essaierai de comprendre ce code.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jicehel

avatar

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

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 16:56

Oui parfait exemple Papydall, bravo Wink
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   Ven 26 Juin 2015 - 17:00

Voila en recursif... Wink
Code:


rem ============================================================================
rem     Utilisation de Include_Turtle.bas
rem          Auteur : Papydall
rem ============================================================================
DIM PILE:PILE=1
DLIST PILE
DIM taille
Init_Turtle()  : ' Indispensable
' Votre programme débute ici
ITEM_ADD PILE,350
Arbre()
end  : ' fin de votre programme
rem ============================================================================
'  Procédure récursive de tracé d'un bel arbre
SUB Arbre()
wait 1
    ' On ne passe pas par un passage de parametre standard, on recupere la valeur qui se trouve dans la DLIST
    taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
    if taille < 5
       forward(taille) : forward(0-taille)
    else
       forward(taille/3) : turn_left(30)

       ITEM_ADD PILE, taille*2/3 : ' plutot que de passer la valeur en paramètre, on la stocke dans la DLIST
       Arbre() : ' Puis on fait l'appel
       ' Comme on vient de sortir de l'appel precedent, il faut revenir dans le contexte d'avant
       ' on récupère donc la valeur  initiale de taille
       taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))

       turn_right(30)
       forward(taille/6) : turn_right(25)
       ITEM_ADD PILE,taille/2 : Arbre()
       ' retour au contexte avant l'appel
       taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
       turn_left(25)
       forward(taille/3) : turn_right(25)
       ITEM_ADD PILE,taille/2
       Arbre()
       taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
       turn_left(25)
       forward(taille/6) : forward(0-taille)
    end_if
    ' Cet appel est terminé, son paramètre n'a plus de raison d'existé dans la DLIST
    ' on l'élimine...
    ITEM_DELETE PILE,COUNT(PILE)
END_SUB
rem ============================================================================
'   !!!!!   LA COMMANDE A NE PAS OUBLIER      !!!!!
#Include "Include_Turtle.bas"
rem =========================== FIN ============================================


EDIT : j'ai rajouté des commentaires pour que tu comprennes... Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 17:10

Voici le début de include_turtle.bas, adapté selon ces règles:
Code:

rem ============================================================================
rem    Exemple d utilisation de
rem        Include_Turtle.bas
rem        Auteur : Papydall
rem ============================================================================
Init_Turtle()  : ' Indispensable
Dlist_Turtle() : ' Klaus: créer les DLIST pour remplacer les variables locales
' Votre programme débute ici
label fin
caption 0,"Veuiller patienter ...... <CLICK> Pour arrêter"
alpha 10 : top 10,100 : left 10,20 : font_size 10,20 : font_bold 10 : font_color 10,255,255,0
on_click 0,fin
Nouveau() : Bouquet_Fleurs()  : pause 1000
Nouveau() : Spirale() : pause 1000
Nouveau() : Set_BG_Color(0,0,255) :  Set_Pen_Color(0,255,0) : Figure(108,10) : pause 1000
Nouveau() : Directions()    : pause 1000
Nouveau() : Demo_1()        : pause 1000
Nouveau() : Demo_2()        : pause 1000
Nouveau() : Demo_3()        : pause 1000
Nouveau() : Demo_Truc()      : pause 1000
Nouveau() : Demo_Ellipse()
print_locate Turtle_Xorigine/2 ,10
print "Cercle orthoptique de l'ellipse en rouge"
print_locate Turtle_Xorigine/2 ,30
print "Cercle principale de l'ellipse en vert  "
print_locate Turtle_Xorigine/2 ,50
print "Cercle secondaire de l'ellipse en jaune " : pause 5000
Nouveau() : Fleurs_Aleatoires() : pause 1000
Nouveau() : Test_1()            : pause 1000
Nouveau() : DrawAxis()          : pause 1000
Nouveau() : Village()          : pause 1000
Nouveau() : Rosace()            : pause 1000
Nouveau() : Fleur()            : pause 1000
Nouveau() : Trois_Bouquets()
caption 10,"Fin du spactacle"
caption 0,"Terminé"
end
' Fin de votre programme
rem ============================================================================
' ajout de Klaus:
sub Dlist_Turtle() : ' Klaus: créer les DLIST pour remplacer les variables locales
  dlist 1001
  ' ... autres DLIST pour d'aures variables locales
end_sub
' Vos procédures commencent ici
SUB Spirale()
  item_add 1001,"0" : ' dim_local n  créer la variable à ce niveau
  Set_Pen_Color(255,175,175)
  Pos_X(-200)
'  for n = 1 to 360 : Turn_Right(6) :  Carre(n/2)  : next n
  item_delete 1001,count(1001)
  item_add 1001,"1"  : repeat : ' for n=1...
    Turn_Right(6)
    Carre(val(item_read$(1001,count(1001)))/2)  : ' Carre(n/2)
    item_add 1001,str$(val(item_read$(1001,count(1001)))+1)
    item_delete 1001,count(1001)-1
  until val(item_read$(1001,count(1001)))=360  : ' next n
  Pos_X(200)
'    for n = 1 to 380 : Turn_Left(6)  :  Carre(n/2)  : next n
  item_delete 1001,count(1001)
  item_add 1001,"1" : repeat  : ' for n=1
    Turn_Left(6)
    Carre(val(item_read$(1001,count(1001)))/2)  : ' Carre(n/2)
    item_add 1001,str$(val(item_read$(1001,count(1001)))+1)
    item_delete 1001,count(1001)-1
  until val(item_read$(1001,count(1001)))=380  : ' next n
  item_delete 1001,count(1001)    : ' libérer la variable à ce niveau
END_SUB
Tu vois que j'ai créé une nouvelle procédure Dlist_Turtle() qui est appelée immédiatement apès Init_Turtle(). Son rôle est la création de toutes les DLIST qui remplaceront les variables locales.
Ensuite, j'ai adapté la première procédure Spirale() pour la rendre réentrante. J'ai remplacé la variable locale n par la dlist 1001, et il n'y a plus de variables locales dans la procédure.

Bon, tu vois le principe. Je reconnais - c'est lourd, fastidieux, tout ce que tu veux. Mais techniquement, c'est possible. Pour moi, c'était le but: prouver la faisabilité technique, mais pas de produire une version rapide ou facile à mettre en oeuvre. Je voulais juste démontrer que c'est possible.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
papydall

avatar

Nombre de messages : 5531
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 - 17:17

Bravo Nardo26
Ça marche.
Une légère modif pour centrer l’arbre
Code:

rem ============================================================================
rem    Utilisation de Include_Turtle.bas
rem          Auteur : Papydall
rem ============================================================================
DIM PILE:PILE=1
DLIST 1
DIM taille
Init_Turtle()  : ' Indispensable
' Votre programme débute ici
ITEM_ADD PILE,350
Pos_Y(-200) : CC(0,255,0) : Arbre()
Caption 0,"terminé"
end  : ' fin de votre programme
rem ============================================================================
'  Procédure récursive de tracé d'un bel arbre
SUB Arbre()
    taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
    if taille < 5
      forward(taille) : forward(0-taille)
    else
      forward(taille/3) : turn_left(30)
      ITEM_ADD PILE, taille*2/3
      Arbre()
      taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
      turn_right(30)
      forward(taille/6) : turn_right(25)
      ITEM_ADD PILE,taille/2
      Arbre()
      taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
      turn_left(25)
      forward(taille/3) : turn_right(25)
      ITEM_ADD PILE,taille/2
      Arbre()
      taille = VAL(ITEM_READ$(PILE,COUNT(PILE)))
      turn_left(25)
      forward(taille/6) : forward(0-taille)
    end_if
    ITEM_DELETE PILE,COUNT(PILE)
END_SUB
rem ============================================================================
'  !!!!!  LA COMMANDE A NE PAS OUBLIER      !!!!!
#Include "Include_Turtle.bas"
rem =========================== FIN ============================================

@Klaus

Merci.
je vais voir ça pour mon instruction!
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 - 17:19

Oui j'ai vu, et j'avais fait ceci, ce qui revient à la même chose :
Code:

...
Init_Turtle()  : ' Indispensable
' Votre programme débute ici
Turtle_Pen_Up_Down=1
Recule(100)
Turtle_Pen_Up_Down=0


Pour la gestion de la DLIST, pour gagner en lisibilité, tu peux t'amuser à créer des procédures PUSH() / POP()..
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
papydall

avatar

Nombre de messages : 5531
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 - 17:38

Klaus a écrit:
Bon, tu vois le principe. Je reconnais - c'est lourd, fastidieux, tout ce que tu veux. Mais techniquement, c'est possible. Pour moi, c'était le but: prouver la faisabilité technique, mais pas de produire une version rapide ou facile à mettre en oeuvre. Je voulais juste démontrer que c'est possible.

Parfaitement clair.
J'ai testé et ça marche, mais comme tu disais ce n'est pas pratique à mettre en oeuvre .
Bravo tu as réalisé le but.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 17:41

Very Happy Very Happy Very Happy Merci !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
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 - 17:49

Tu n'es pas obligé de créer plusieurs DLIST Klaus,
il suffit de bien mémoriser dans quel ordre tu insères les paramètres dans la dlist.
C'est une pile LIFO...

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

avatar

Nombre de messages : 5531
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 - 17:51

@Nardo
Turtle_Pen_Up_Down est une variable gérée par le programme et l’utilisateur n’a pas à s'en soucier.
Pour cela, on utilise les commandes :
LeveCrayon() ou LC() ou Pen_Up() (pour se déplacer sans laisser de traces)
BaisseCrayon() ouBC() ou Pen_Down() ( pour se déplacer en dessinant)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jean Claude

avatar

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

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 18:16

Bravo Papydall,
C'est super, avec des résultats surprenants de beauté.

Les créateurs de joligone et autres dessins vont pouvoir s'en donner à cœur joie.

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5531
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 - 18:28

Merci Jean Claude.
Toi aussi, tu peux exhiber tes talents de créateurs de belles images avec les routines tortue.
Un peu de réflexion, une bonne dose d’amour de Panoramic et surtout du temps libre, c’est qui manque le plus à la majorité.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Jean Claude

avatar

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

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 18:34

Une très simple.

J'ai voulu colorier l'intérieur des rectangles avec Colorie(r,g,b), mais je n'ai pas réussi.

Code:
rem ============================================================================
rem    Utilisation de Include_Turtle.bas
rem          Auteur : Papydall
rem ============================================================================

dim n%
rem ============================================================================
Init_Turtle()  : ' Indispensable
' Votre programme débute ici
' Rectangle(screen_x/4,screen_y/4)
    CouleurFond(0,0,0)
for n%=1 to 360 step 10
    CouleurCrayon(rnd(255),rnd(255),rnd(255))
    Rectangle_Oblique(n%,screen_x/8,screen_y/8)
next n%
end  : ' fin de votre programme
rem ============================================================================
' Vos procédures ici
  SUB Rectangle(long,larg)
    dim_local i
    for i = 1 to 2 : AV(larg) : TD(90) : AV(long) : TD(90) : next i
END_SUB
'
SUB Rectangle_Oblique(ang,long,larg)
    Cap(ang) : Rectangle(long,larg)
END_SUB
'
' Fin de vos procédures
rem ============================================================================
'  !!!!!  LA COMMANDE A NE PAS OUBLIER      !!!!!
' #Include "Include_Turtle.bas"
rem =========================== FIN ============================================
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   Ven 26 Juin 2015 - 18:38

Merci Papydall pour cette précision...
J'ai simplifié l'utilisation de la récursivite.
Jette un coup d'oeil à ceci, cela pourra te donner des idées.
Code:



rem ============================================================================
rem    Utilisation de Include_Turtle.bas
rem          Auteur : Papydall
rem ============================================================================


Init_Turtle()  : ' Indispensable
' Votre programme débute ici
LeveCrayon()
Recule(200)
BaisseCrayon()

PUSH(50): Arbre()
MessageBox("That's all folks !","Routine tortue par Papydall",1,2)

end  : ' fin de votre programme


rem ============================================================================
'  Procédure récursive de tracé d'un bel arbre
rem ============================================================================
SUB Arbre()
  IF VARIABLE("taille")=0 THEN DIM taille
  wait 1
    ' On ne passe pas par un passage de parametre standard, on recupere la valeur qui se trouve dans la DLIST
    POP(): taille=POP_RETURN
    if taille < 5
      forward(taille) : forward(0-taille)
    else
      forward(taille/3) : turn_left(30)

      PUSH(taille*2/3) : Arbre()

      turn_right(30)
      forward(taille/6) : turn_right(25)

      PUSH(taille/2) : Arbre()

      turn_left(25)
      forward(taille/3) : turn_right(25)

      PUSH(taille/2) : Arbre()

      turn_left(25)
      forward(taille/6) : forward(0-taille)
    end_if
    ' Cet appel est terminé, son paramètre n'a plus de raison d'existé dans la DLIST
    ' on l'élimine et on recupere l'ancienne valeur...
    CLR() : POP(): taille=POP_RETURN
END_SUB

SUB PUSH(v)
  IF VARIABLE("PILE")=0
    DIM PILE: PILE = NUMBER_OBJECTS + 1 : DLIST PILE
  END_IF
 ITEM_ADD PILE,v
END_SUB

SUB POP()
  IF VARIABLE("POP_return")=0 THEN DIM POP_return
  IF COUNT(PILE)<>0 THEN POP_return=VAL(ITEM_READ$(PILE,COUNT(PILE)))
END_SUB

SUB CLR()
  IF COUNT(PILE)<>0 THEN ITEM_DELETE PILE,COUNT(PILE)
END_SUB

rem ============================================================================
'  !!!!!  LA COMMANDE A NE PAS OUBLIER      !!!!!
#Include "Include_Turtle.bas"
rem =========================== FIN ============================================


sub MessageBox(txt$,tit$,popt%,pico%)
' Valeurs possibles pour popt%:
' 1 = MB_OK              = 0x00000000L - one push button: OK. This is the default.
' 2 = MB_OKCANCEL        = 0x00000001L - two push buttons: OK and Cancel.
' 3 = MB_RETRYCANCEL    = 0x00000005L - two push buttons: Retry and Cancel.
' 4 = MB_YESNO          = 0x00000004L - two push buttons: Yes and No.
' 5 = MB_YESNOCANCEL    = 0x00000003L - three push buttons: Yes, No, and Cancel.
'
' Valeurs possibles pour pico%:
' 1 = MB_ICONWARNING    = 0x00000030L - An exclamation-point icon appears in the message box.
' 2 = MB_ICONINFORMATION = 0x00000040L - An icon consisting of a lowercase letter i in a circle appears in the message box.
' 3 = MB_ICONQUESTION    = 0x00000020L - A question-mark icon appears in the message box. The question-mark message icon is no longer recommended because it does not clearly represent a specific type of message and because the phrasing of a message as a question could apply to any message type. In addition, users can confuse the message symbol question mark with Help information. Therefore, do not use this question mark message symbol in your message boxes. The system continues to support its inclusion only for backward compatibility.
' 4 = MB_ICONSTOP        = 0x00000010L - A stop-sign icon appears in the message box.

  dim_local res%, ad1%, hdc%, ad2%, ad3%, opt%, ico%
  if variable("MessageBox%")=0 then dim MessageBox%

  dll_on "User32.dll"

  ad1% = adr(txt$)
  poke adr(ad2%),peek(ad1%)
  poke adr(ad2%+1),peek(ad1%+1)
  poke adr(ad2%+2),peek(ad1%+2)
  poke adr(ad2%+3),peek(ad1%+3)
  ad1% = adr(tit$)
  poke adr(ad3%),peek(ad1%)
  poke adr(ad3%+1),peek(ad1%+1)
  poke adr(ad3%+2),peek(ad1%+2)
  poke adr(ad3%+3),peek(ad1%+3)

  if popt%=1 then opt% = 0
  if popt%=2 then opt% = 1
  if popt%=3 then opt% = 5
  if popt%=4 then opt% = 4
  if popt%=5 then opt% = 3

if pico%=1 then ico% = 48
if pico%=2 then ico% = 64
if pico%=3 then ico% = 32
if pico%=4 then ico% = 16

  MessageBox% = dll_call4("MessageBoxA",0,ad2%,ad3%,opt%+ico%)

  dll_off
end_sub

EDIT à 21:04 : Prise en compte des remarques de Papydall. Smile


Dernière édition par Nardo26 le Ven 26 Juin 2015 - 22:04, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://nardo26.lescigales.org
Jicehel

avatar

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

MessageSujet: Re: Les routines Tortue   Ven 26 Juin 2015 - 18:43

Classe Nardo, je retourne 20 ans en arrière dans mes cours sur la récursivité et le code est on ne peut plus simple et lisible.
Bravo à tous pour cette adaptation des grands classiques.
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 1 sur 3Aller à la page : 1, 2, 3  Suivant
 Sujets similaires
-
» Dame Tortue
» Envoi d'une réponse automatique au 1er post d'un nouveau Mem
» copier/coller des images
» [résolu]Session laguée sous Windows 7
» C'est l'histoire d'une tortue, qui se tord et qui se tue ? Euphemia

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: