Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Les programmes de papydall | |
|
+6Froggy One Ouf_ca_passe JL35 Minibug papydall jean_debord 10 participants | |
Auteur | Message |
---|
jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Les programmes de papydall Jeu 7 Nov 2019 - 10:55 | |
| Les programmes de papydall constituent une mine d'exemples à adapter En voici un : le calcul du centre de gravité et de la surface d'un polygone. - Code:
-
' ******************************************************************* ' Aire et centre de gravite d'un polygone ' D'apres un programme de Papydall sur le forum Panoramic ' *******************************************************************
' Description du polygone : nombre de sommets, coordonnees des points
data 5 data 50, 100 data 350, 250 data 550, 150 data 400, 350 data 100, 300
dim n%, i%, a, xg, yg
read n%
dim x(n%), y(n%)
for i% = 1 to n% read x(i%), y(i%) next i%
mode 1, "Aire et Centre de gravite d'un polygone"
' Dessin du polygone
pen CL_VERT_VIF
move x(1), y(1) for i% = 1 to n% - 1 draw x(i% + 1), y(i% + 1) next i% draw x(1), y(1)
' Calcul du centre de gravite
centre_gravite x(), y(), a, xg, yg
' Remplissage de la surface
move xg, yg fill CL_VERT_VIF
' Marquage du centre de gravite
pen CL_ROUGE_VIF pie xg, yg, 5
' Ecriture des resultats
pen CL_BLANC
locate 4, 22 print "Centre de gravite : (" & int(xg) & "," & int(yg) & ")"
locate 4, 24 print "Aire du polygone : " & a
while inkey$() = "" : wend
' ------------------------------------------------------
sub centre_gravite (x(), y(), a, xg, yg) ' Calcule l'aire (a) et la position du centre de gravite (xg, yg) ' pour le polygone a n sommets de coordonnees x(1..n), y(1..n) ' Les coordonnees du dernier point sont copiees dans x(0) et y(0)
dim n%
n% = ubound(x) x(0) = x(n%) y(0) = y(n%) dim z(n%), i%, s, b
s = 0 for i% = 0 to n% - 1 z(i%) = x(i%) * y(i% + 1) - x(i% + 1) * y(i%) s = s + z(i%) next i
a = s / 2 b = 1 / (3 * s)
s = 0 for i% = 0 to n% - 1 s = s + z(i%) * (x(i%) + x(i% + 1)) next i
xg = s * b
s = 0 for i% = 0 to n% - 1 s = s + z(i%) * (y(i%) + y(i% + 1)) next i%
yg = s * b end_sub
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Jeu 7 Nov 2019 - 22:43 | |
| Salut Jean_debord Je viens d’installer le crocodile pour la 1ère fois et j’avoue que c’est un travail de pro ! Merci, Jean. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Dim 10 Nov 2019 - 16:06 | |
| Merci papydall Voici un autre exemple sur les polygones, avec cette fois-ci une contribution de Klaus : - Code:
-
' ******************************************************************* ' Recherche d'un point a l'interieur d'un polygone ' D'apres un programme de Klaus sur le forum Panoramic ' *******************************************************************
' Description du polygone : nombre de sommets, coordonnees des points
data 5 data 50, 100 data 350, 250 data 550, 150 data 400, 350 data 100, 300
dim n%, i%, dx, xp, yp
read n%
dim x(n%), y(n%)
for i% = 1 to n% read x(i%), y(i%) next i%
dx = 5
if not pt_dans_polygone(x(), y(), dx, xp, yp) then print "Point interieur non trouve !" end end_if
mode 1, "Trouver un point a l'interieur d'un polygone"
' Dessin du polygone pen CL_VERT_VIF move x(1), y(1) for i% = 1 to n% - 1 draw x(i% + 1), y(i% + 1) next i% draw x(1), y(1)
' Remplissage de la surface
move xp, yp fill CL_VERT_VIF
' Marquage du point interieur au polygone
pen CL_ROUGE_VIF pie xp, yp, 5
' Ecriture des resultats
pen CL_BLANC
locate 4, 22 print "Coordonnees du point : (" & int(xp) & "," & int(yp) & ")"
while inkey$() = "" : wend
sub pt_sur_mediane (x(), y(), i%, dx, act%, xp, yp) ' Cherche un point (xp,yp) sur la mediane issue du sommet i ' dx = pas du deplacement sur Ox ' act = sens du deplacement (+/- 1)
dim n%, im1%, ip1%, xm, ym, m, dx1
n% = ubound(x)
' 2 points de part et d'autre du point i if i% = 1 then im1% = n% else im1% = i% - 1 if i% = n% then ip1% = 1 else ip1% = i% + 1
' Milieu du segment defini par ces 2 points xm = 0.5 * (x(im1%) + x(ip1%)) ym = 0.5 * (y(im1%) + y(ip1%))
' Pente de la mediane m = (ym - y(i%)) / (xm - x(i%))
' Position du point sur la mediane dx1 = act% * dx xp = x(i%) + dx1 yp = y(i%) + m * dx1 end_sub
function pt_interieur% (x(), y(), xp, yp) ' Teste si le point (xp,yp) est a l'interieur du polygone ' Si oui retourne TRUE, sinon FALSE
dim n%, i%, j%, lg1%, lg2%, adroite%, agauche%, xx
n% = ubound(x)
for i% = 1 to n% if i% < n% then j% = i% + 1 else j% = 1
' Pour chaque arete du polygone, tester si elle coupe ' l'horizontale passant par le point (xp,yp) lg1% = (y(i%) <= yp and y(j%) > yp) lg2% = (y(i%) > yp and y(j%) <= yp)
' Si c'est le cas, calculer l'abscisse xx de l'intersection ' et basculer l'indicateur approprie
if lg1% or lg2% then xx = x(i%) + (y(j%) - y(i%)) * (yp - y(i%)) / (x(j%) - x(i%)) if xx < xp then agauche% = not agauche% if xx > xp then adroite% = not adroite% end_if next i%
return (agauche% and adroite%) end_function
function pt_dans_polygone% (x(), y(), dx, xp, yp) ' Cherche un point (xp,yp) a l'interieur du polygone ' a n sommets de coordonnees x(1..n), y(1..n) ' dx = deplacement sur Ox ' Retourne TRUE si succes, FALSE sinon
dim i%
for i% = 1 to ubound(x) pt_sur_mediane x(), y(), i%, dx, 1, xp, yp if pt_interieur(x(), y(), xp, yp) then return TRUE
pt_sur_mediane x(), y(), i%, dx, -1, xp, yp if pt_interieur(x(), y(), xp, yp) then return TRUE next i%
return FALSE end_function
Remarquons l'utilisation de quelques astuces de FBCroco : - récupération de la taille des tableaux à l'intérieur d'un sous-programme par UBOUND (ceci évite d'avoir à passer la taille en paramètre) - utilisation des constantes TRUE et FALSE pour les variables binaires - affectation du résultat d'un test à une variable : - Code:
-
lg1% = (y(i%) <= yp and y(j%) > yp)
- sortie d'une FUNCTION par RETURN avec affectation automatique du résultat Tout cela simplifie l'écriture des programmes. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Dim 10 Nov 2019 - 16:13 | |
| Un autre exemple : les courbes de Bézier : - Code:
-
' ******************************************************************* ' Courbes de Bezier ' ' Connaissant 4 points A(0,0), B(1,0), C(1,1) et D(0,1) on demande ' de tracer les courbes alpha = B(A, B, C, D), beta = B(A, B, D, C) ' et gamma = B(A, C, B, D) ' ' cf. http://www.math.u-psud.fr/~perrin/CAPES/geometrie/BezierDP.pdf ' *******************************************************************
' Le trace se fait sur une zone de 400x400
const Ax = 0, Ay = 0 const Bx = 400, By = 0 const Cx = 400, Cy = 400 const Dx = 0, Dy = 400
mode 3, "Courbes de Bezier", 500, 500
print "A", 40, 40 print "B", 445, 40 print "C", 445, 472 print "D", 45, 472
origin 50, 50, 50, 450, 450, 50, CL_NOIR, CL_BLANC
plot_curve Ax, Ay, Bx, By, Cx, Cy, Dx, Dy, CL_ROUGE_VIF, 280, 110, "alpha" plot_curve Ax, Ay, Bx, By, Dx, Dy, Cx, Cy, CL_VERT_VIF, 280, 370, "beta" plot_curve Ax, Ay, Cx, Cy, Bx, By, Dx, Dy, CL_TURQUOISE_VIF, 20, 300, "gamma"
while inkey$() = "" : wend
' ----------------------------------------------------------------------------
sub bezier (x0, y0, x1, y1, x2, y2, x3, y3, x(), y()) ' ---------------------------------------------------------------------------- ' Calcul d'une courbe de Bezier cubique ' D'apres papydall sur le forum Panoramic ' ---------------------------------------------------------------------------- ' Une courbe de Bezier cubique est definie par quatre points P0, P1, P2 et P3 ' de coordonnees (x0,y0), (x1,y1), (x2,y2) et (x3,y3) ' P0 et P3 correspondent aux points des extremites ou noeuds de la courbe. ' P1 et P2 correspondent aux points de controle ou poignees, chacun apparie ' avec l'un des points terminaux. ' Les points de controle ont l'utile propriete suivante : ' Une ligne debutant a une extremite de la courbe et se terminant au point de ' controle correspondant est tangente a la courbe au point terminal. ' Ceci permet la jonction douce de multiples courbes de Bezier.
' La courbe se trace en partant du point P0, en se dirigeant vers le point P1 ' et en arrivant au point P3 selon la direction P2-P3. ' La courbe ne passe pas necessairement par P1 ni par P2.
' Le sous-programme calcule (n + 1) points de la courbe de Bezier ' et les retourne dans x(0..n) et y(0..n) ' ----------------------------------------------------------------------------
dim n%, i%, t, t2, t3, u, u2, u3, a, b
n% = ubound(x)
for i% = 0 to n% t = i% / n% t2 = t * t t3 = t2 * t u = 1 - t u2 = u * u u3 = u2 * u a = 3 * u2 * t b = 3 * u * t2 x(i%) = u3 * x0 + a * x1 + b * x2 + t3 * x3 y(i%) = u3 * y0 + a * y1 + b * y2 + t3 * y3 next i% end_sub
sub plot_curve (x0, y0, x1, y1, x2, y2, x3, y3, col%, lgdx%, lgdy%, lgd$) ' ---------------------------------------------------------------------------- ' Trace la courbe de Bezier avec la couleur col ' Ecrit la legende a la position (lgdx, lgdy) ' ----------------------------------------------------------------------------
const n = 50 ' Nb de points pour la courbe de Bezier dim x(n), y(n) ' Coordonnees des points dim i% ' Indice du point
bezier x0, y0, x1, y1, x2, y2, x3, y3, x(), y()
pen col%
move x(0), y(0) for i% = 1 to n% draw x(i), y(i) next i%
print lgd$, lgdx%, lgdy% end_sub
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Ven 22 Nov 2019 - 9:36 | |
| Une version colorée du dernier programme de papydall : - Code:
-
const RadToDeg = 180 / 3.14159
dim x%, y%, r%, g%, b%, h
mode 3, "Triangle de Sierpinski", 500, 500
for x% = 1 to 500 for y% = 1 TO 500 h = atan2(y%, x%) * RadToDeg HSVtoRGB h, 1, 1, r%, g%, b% pen RGB(r%, g%, b%) plot x%, x% and y% next y% next x%
while inkey$() = "" : wend
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Ven 22 Nov 2019 - 14:17 | |
| Merci jean_debord En couleur c'est mieux. ... et en ajoutant BIN_OR, ça complète l'espace. - Code:
-
const RadToDeg = 180 / 3.14159
dim x%, y%, r%, g%, b%, h
mode 3, "Triangle de Sierpinski", 500, 500
for x% = 1 to 500 for y% = 1 TO 500 h = atan2(y%, x%) * RadToDeg HSVtoRGB h, 1, 1, r%, g%, b% pen RGB(r%, g%, b%) plot x%, x% and y% plot x%, x% or y% next y% next x%
while inkey$() = "" : wend
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Ven 22 Nov 2019 - 22:57 | |
| Je me suis mis à l’école de CROCODILE BASIC. Voici mon premier code : - Code:
-
dim x,y,nextx,nexty,r
mode 3, "PAPYDALL A L'ECOLE DE CROCODILE BASIC : Fougere de Sierpinski",500,500 : origin 250, 30 pen RGB(0, 255,0 )
while inkey$() = "" r = rnd() if r < .01 then nextx = 0 : nexty = .16*y if r >= .01 and r < .08 then nextx = .2*x- .26*y : nexty = .23*x+.22*y+1.6 if r >= .08 and r < .15 then nextx = -.15*x+.28*y : nexty = -.26*x+.24*y+.44 if r >= .15 then nextx = .85*x+.04*y : nexty = -.04*x+.85*y+1.6 x = nextx : y = nexty plot 60 * x,40 * y wend
- Résultat:
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Sam 23 Nov 2019 - 1:40 | |
| - Code:
-
rem ============================================================================ rem récursivité rem ============================================================================ dim xc,yc xc = 350 : yc = 350 mode 3, "PAPYDALL TESTE LA RECURSIVITE AVEC CROCODILE BASIC : ",700,700 Cercle(xc,yc,xc-20) while inkey$ = "" : wend rem ============================================================================ SUB Cercle(x,y,r) arc x,y,r ' tracer un cercle if r > 50 then Cercle(x + r / 2, y, r / 2) ' 1er appel recursif Cercle(x - r / 2, y, r / 2) ' 2eme appel recursif Cercle(x, y + r / 2, r / 2) ' 3eme appel recursif Cercle(x, y - r / 2, r / 2) ' 4eme appel recursif end_if END_SUB rem ============================================================================
- ça donne ça:
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Sam 23 Nov 2019 - 9:32 | |
| Oui la récursivité marche très bien !
La prochaine version de FBCroco apportera les nombres complexes. J'ai déjà adapté ton programme de transformation conforme.
Je vais faire un sous-répertoire contrib\papydall pour y mettre les exemples que tu proposes.
Bonne continuation avec le crocodile !
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Sam 23 Nov 2019 - 17:16 | |
| Merci Jean pour ce beau travail. De mon côté j’essaie d’adapter quelques codes que j’ai faits pour le compilateur Panoramic, mais à mon rythme (santé oblige) et à mon avancement dans l'apprentissage du crocodile.A propos, existe-t-il en Crocodile Basic (j’accepte même en Caïman ou en Alligator ) une instruction qui définit la largeur (W en pixels) des tracés qui est équivalente à 2D_PEN_WIDTH W de Panoramic ? REM : avec les nombres complexes, on va bien danser travailler! A ++ | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Sam 23 Nov 2019 - 18:00 | |
| @Jean_Debord Est-t-il possible d'adapter la ligne 31 : 2d_pen_width wp% - Code:
-
' **************************************************************************** ' * Un arbre, une forêt en récursif * ' ****************************************************************************
dim w,h,wp%,col%,i%
mode 3, "LA FORET PAR PAPYDALL",1000,700 print "VOICI UN ARBRE",300,650 print "UNE TOUCHE POUR TRACER UNE FORET",200,600
Arbre(500,60,100,pi) while inkey$ = "" : wend for i% = 1 to 10 Arbre(10+800*rnd(),10+200*rnd(),10+50*rnd(),pi) next i% print " ",200,650 print "UNE TOUCHE POUR SORTIR DE LA FORET ...",200,600
while inkey$ = "" : wend end rem ============================================================================ SUB Arbre(x,y,size,angle) col% = rgb(0,255,0) pen col% if size > 2 then ' ____________________________________________________________ ' * * ' * wp% = size / 4 * ' * if wp% < 1 then wp% = 1 * ' * if wp% > 20 then wp% = 20 * ' * 2d_pen_width wp% <----------- Adapter cette commande * ' *____________________________________________________________*
plot x,y,col% draw int(x - size * sin(angle)), int(y - size * cos(angle)) Arbre(x-size*sin(angle),y-size*cos(angle),6*size/8,angle+0.6+rnd(100)/200) Arbre(x-size*sin(angle),y-size*cos(angle),6*size/8,angle-0.6+rnd(100)/200)
end_if END_SUB rem ============================================================================
- Spoiler:
- Spoiler:
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Sam 23 Nov 2019 - 19:51 | |
| - papydall a écrit:
Est-t-il possible d'adapter la ligne 31 : 2d_pen_width wp%
Hélas non ! Mais c'est possible avec FBPano en utilisant les graphismes FLTK. Mais ce n'est que partie remise. FBPano et FBCroco sont appelés à fusionner. | |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Jeu 28 Nov 2019 - 16:26 | |
| Les graphismes FLTK devraient être disponibles dans la prochaine version de FBCroco. On aura alors (entre autres) une commande FL_PEN_STYLE pour choisir l'épaisseur du trait ainsi que les lignes pointillées. Voici un exemple de la syntaxe envisagée : - Code:
-
mode 1
' Instructions de type Amstrad
move ... draw ...
' Instructions de type FLTK
fl_pen_style ...
fl_move ... fl_draw ...
fl_image_display
L'instruction FL_IMAGE_DISPLAY est obligatoire pour afficher les graphismes FLTK car ceux-ci sont dessinés sur une image en mémoire qui doit être collée sur l'écran graphique. Bien sûr une commande telle que FL_PEN_STYLE n'affectera que les fonctions FL_... Les fonctions de type Amstrad conserveront leur spécificité (donc 1 pixel de large pour les lignes) Je pense que cela devrait marcher. Les premiers tests sont encourageants | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Sam 30 Nov 2019 - 1:23 | |
| Merci Jean_Debord pour ce travail et bonne continuation! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Lun 2 Déc 2019 - 15:02 | |
| - Code:
-
' ============================================================================================ ' Calcul des 1000 premières décimales de PI ' ============================================================================================ dim t(202) dim nmax%,b%,d%,p%,m%,n%,i%,q%,r% dim tex$,aff$
mode 2," CALCUL DES 1000 PREMIERES DECIMALES DE PI "
nmax = 3340 : b = 100000 for i = 1 to 201 : t(i) = 0 : next i t(0) = 2*nmax : d = 2*nmax+1 Divise for n = nmax to 2 step -1 t(0) = t(0)+2 : d = 2*n-1 : Divise m = n-1 : Multiplie next n t(0) = t(0)+2 aff$ = "PI = 3." + chr$(13) + " " for i = 1 to 200 tex$ = str$(t(i)) while len(tex$) < 5 : tex$ = "0" + tex$ : end_while aff$ = aff$ + " " + tex$ if i mod 10 = 0 then aff$ = aff$ + chr$(13)+" " next i print aff$ locate 20,24 : print "....Une touche pour sortir ..."
while inkey = "" : wend '============================================================================================ SUB Divise() for i = 0 to 201 q = int(t(i)/d) : r = t(i)-d*q : t(i) = q : t(i+1) = t(i+1)+b*r next i END_SUB rem ========================================================================================= SUB Multiplie() q = 0 for i = 201 to 1 step -1 p = t(i) * m + q : q = int(p/b) : t(i) = p - q * b next i t(0) = t(0) * m + q END_SUB rem =========================================================================================
- Résultat:
| |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Lun 2 Déc 2019 - 17:41 | |
| Salut Jean. Peux-tu jetez un œil sur ce code et pourquoi cette erreur à la compilation ? - Code:
-
dim n% mode 2 for n = 32 to 255 print n; " = " ; chr$(n); : ' error 57 : Type mismatch, at parameter 1 of __PRINT__() in '__print__n; " = " chr(n);' next n while inkey = "" : wend
D’ailleurs, le simple code suivant n’affiche que le mot bonjour en écrasant le salut. - Code:
-
print "salut" print "bonjour"
Il parait (mais je me trompe peut-être) que le crocodile n'apprécie ni la virgule, ni le point-virgule ni même le passage à la ligne dans la commande PRINT, encore moins le mélange de type dans les PRINT même à des endroits différents du programme. - Code:
-
dim n%,a$ mode 2 n% = 123 a$ = "Croco" print n% : ' <<< error Type mismatch etc ... print a$ while inkey = "" : wend
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Mar 3 Déc 2019 - 8:47 | |
| - papydall a écrit:
Il parait (mais je me trompe peut-être) que le crocodile n'apprécie ni la virgule, ni le point-virgule ni même le passage à la ligne dans la commande PRINT, encore moins le mélange de type dans les PRINT même à des endroits différents du programme.
C'est bien cela, mais uniquement en mode graphique ( mode 2 dans ton exemple). En mode texte, tout se passe normalement. En mode graphique, on ne peut imprimer que des chaînes de caractères, pouvant inclure des caractères de contrôle. Par exemple on pourrait faire : - Code:
-
print a$ & n% & chr$(13) & a$
La version __PRINT__ est celle qui figure dans le code FreeBASIC pour la différencier du PRINT normal. Je n'ai pas cru bon de mettre 2 mots-clés différents, mais on pourrait le faire (par exemple GPRINT pour le mode graphique) En mode graphique, chaque caractère est considéré comme un sprite. C'est grâce à cela qu'on peut avoir des caractères semi-graphiques et des caractères redéfinissables. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Mer 4 Déc 2019 - 5:07 | |
| Merci Jean pour ta réponse. J'ai pigé. Voici un code qui dessine l'arbre de Pythagore (en récursif). - Code:
-
rem =================================================== rem Arbre de Pythagore rem =================================================== dim h,w,w2,diff w = 800 : h = w * 11 \ 16 : w2 = w \ 2 : diff = w \ 12 mode 3,"Arbre de Pythagore",w,h
pythagoras_tree(w2 - diff, h - 10 , w2 + diff , h - 10 , 0) locate 1,2 : print "Arbre de " locate 45,2 : print "Par" locate 1,4 : print "Pythagore" locate 43,4 : print "Papydall" locate 1,34 : print "Une touche ..." locate 36,34 : print "... pour sortir" while inkey() = "" : wend end rem ===================================================== SUB pythagoras_tree(x1, y1, x2 , y2 , depth) dim dx,dy,x3,y3,x4,y4,x5,y5 If depth > 12 Then exit_sub : ' <<<< Essayez d'autres valeur autre que 12 dx = x2 - x1 : dy = y1 - y2 x3 = x2 - dy : y3 = y2 - dx x4 = x1 - dy : y4 = y1 - dx x5 = x4 + (dx - dy) / 2 y5 = y4 - (dx + dy) / 2 plot x1,h-y1 : draw x2,h-y2 : draw x3,h-y3 : draw x4,h-y4 : draw x1,h-y1 pythagoras_tree(x4, y4, x5, y5, depth + 1) pythagoras_tree(x5, y5, x3, y3, depth + 1) END_SUB rem ======================================================
- Pour ceux qui n'ont pas mordu au crocodile, voici ce que ça donne:
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Mer 4 Déc 2019 - 9:43 | |
| Bonjour Papydall Merci pour ces nouveaux exemples. Le dossier contrib\papydall se remplit rapidement ! Les gens ne mordent pas au crocodile parce qu'ils ont peur d'être mordus par lui | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Mer 4 Déc 2019 - 21:40 | |
| Je vous laisse découvrir par vous-même ce que fait le programme suivant! - Code:
-
rem ============================================================================ rem IMPLEMENTATION DES COMMANDES TURTLE DU TYPE LOGO rem ============================================================================ rem LES COMMANDES SUIVANTES SONT DISPONIBLES rem rem FPOS(xp,yp) : Place la tortue en (xp,yp), le cap n est pas modifié rem ORIGINE() : Remet la tortue à l origine, cap vers le Nord rem FCAP(angle0) : Oriente la tortue dans une direction (en degrés) rem AVANCE(d) : Avance de d pixels en dessinant rem RECULE(d) : Recule de d pixels en dessinant rem GAUCHE(a) : Tourne à gauche de a degrés rem DROITE(a) : Tourne à droite de a degrés rem ============================================================================ rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& rem ============================================================================ rem DEMO const Deg2Rad = pi/180 dim x,y,x0,y0,angle
mode 3,"Utilisation des commandes du type LOGO",800,600 : origin 400,300 x0 = 0 : y0 = 0 : origine
Demo locate 1,2 : print "That's all folks !!!" locate 1,35 : print "Une touche pour sortir ..." while inkey() = "" : wend end rem ============================================================================ ' Les commandes SLEEP dans certaines SUB ont pout but de ralentir un peu le tracé ' Vous pouvez les mettre en REM ou modifier leur argument. rem ============================================================================ SUB Demo() Carre(150) : Info Polygone(100,6) : Info Etoile : Info Fpos(x0-100,y0-200) : Koch(1,5) : Info Fpos(x0,y0-250) : Arbre(15,500) : Info Slalom : Info Joggy_Star : Info Hexagone : Info Rosace : Info Peltonwheel : Info Hairy_Star END_SUB rem ============================================================================ SUB Info() locate 8,2 : print "DEMO DES COMMANDES TURTLE PAR PAPYDALL" : sleep 2000 : cls END_SUB rem ============================================================================ SUB Carre(c) dim i for i = 1 to 4 : Avance(c) : Droite(90) : sleep 100 : next i END_SUB rem ============================================================================ SUB Polygone(longueur,NbCotes) dim i for i = 1 to NbCotes Avance(longueur) : Droite(360/NbCotes) sleep 100 next i END_SUB rem ============================================================================ ' Etoile à 6 branches SUB Etoile() dim i for i = 1 to 6 Avance(100) : Droite 120 : Avance(100) : Gauche(60) sleep 100 next i END_SUB rem ============================================================================ SUB Koch(l,n) if n = 0 then avance(1) else Koch(l/3,n-1) gauche(60) : Koch(l/3,n-1) droite(120) : Koch(l/3,n-1) gauche(60) : Koch(l/3,n-1) end_if END_SUB rem ============================================================================ SUB Arbre(n,longueur) dim angle = 30 if n = 0 then Avance(longueur) : recule(longueur) else Avance(longueur/3) Gauche(angle) : Arbre(n-1,longueur/3*2) Droite(2*angle) : Arbre(n-1,longueur/3*2) Gauche(angle) : Recule(longueur/3) end_if END_SUB rem ============================================================================ SUB Slalom() dim i Fpos(x0+300,y0+200) for i = 0 to 5000 Avance(5) : Droite(90*sin(i*Deg2Rad)) next i END_SUB rem ============================================================================ SUB Joggy_Star() dim i fpos(x0+200,2*y0) for i = 0 to 2200 avance(25*sin(Deg2Rad*i)) : droite(i*i) next i END_SUB rem ============================================================================ SUB Hexagone() dim i,j,k origine for i = 100 to 10 step -5 for j = 1 to 6 for k = 1 to 6 : avance(i) : gauche(60) : next k gauche(60) next j sleep 100 next i END_SUB rem ========================================================================== SUB Rosace() dim i,j Origine for i = 1 to 18 droite(30) for j = 1 to 18 droite(20) : avance(30) next j sleep 100 next i END_SUB rem ============================================================================ SUB Peltonwheel() dim i Origine for i = 0 to 220 avance(i) : recule(i) : droite(51) sleep 10 next i END_SUB rem ============================================================================ SUB Hairy_Star() dim i Origine() : fpos(x0+200,y0) for i = 0 to 7000 avance(10) : droite(180*sin(Deg2Rad*i*i)) ' sleep 1 : ' Pour suivre le tracé. Vous povez la mettre en REM pour un tracé immédiat next i END_SUB rem ============================================================================ rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& rem ============================================================================ ' ************* Commandes du type LOGO ********************* rem ============================================================================ rem &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& rem ============================================================================ ' Place la tortue en (xp,yp), le cap n'est pas modifié SUB fpos(xp,yp) x = xp y = yp END_SUB rem ============================================================================ ' Remet la tortue à l'origine, cap vers le Nord ' Les angles sont en degrés et sont comptés dans le sens horaire ' 0° (ou 360) correspond à la direction NORD ' 90° ---------------------------------- EST ' 180° ---------------------------------- SUD ' 270° ---------------------------------- OUEST SUB Origine() fpos(x0,y0) fcap(90) END_SUB rem ============================================================================ ' Oriente la tortue dans une direction (en degrés) ' Les angles sont comptés dans le sens horaire (l'axe horizontal correspond à 0°) SUB fcap(angle0) angle = angle0 END_SUB rem ============================================================================ ' Avance de d pixels en dessinant SUB avance(d) dim x2,y2 x2 = x + d * cos(angle*Deg2Rad) y2 = y + d * sin(angle*Deg2Rad) plot x,y : draw x2,y2 x = x2 : y = y2 END_SUB rem ============================================================================ ' Récule de d pixels en dessinant SUB recule(d) avance(-d) END_SUB rem ============================================================================ ' Tourne à gauche de a degrés SUB gauche(a) angle = angle - a END_SUB rem ============================================================================ ' Tourne à droite de a degrés SUB droite(a) angle = angle + a END_SUB rem ============================================================================ ' ************* Fin Commandes LOGO ********************* rem ============================================================================
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| | | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Les programmes de papydall Mer 4 Déc 2019 - 22:43 | |
| Ou très intéressé, mais c'est caïman pareil ! | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Mer 4 Déc 2019 - 22:51 | |
| Dans les années 1980, j’étais animateur dans un club informatique de l’association tunisienne « Jeunes & Science ». On disposait déjà de 8 ordinateurs CPC 64 et 8 autres CPC128. Le Croco (merci une fois encore à Jack et à Jean_debord) c’est un peu comme un retour à la jeunesse. J’ai vieilli un peu (même beaucoup) en physique et en activité mentale, mais je suis toujours un gosse dans ma tête ! Tu voies bien le lien entre le crocodile et moi. - Spoiler:
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Les programmes de papydall Jeu 5 Déc 2019 - 9:50 | |
| Dans les années 80, à la faculté de Pharmacie de Limoges où je travaillais, un professeur avait équipé une salle de travaux pratiques avec des ordinateurs Amstrad.
Je crois me souvenir qu'un étudiant avait fait sa thèse en concevant un programme pour cette machine.
A part ça, merci pour cette nouvelle contribution.
Et quant aux fonctions graphiques FLTK, elles sont caïman... euh, quasiment au point. Ce sera dans la prochaine version. | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Les programmes de papydall Ven 6 Déc 2019 - 4:39 | |
| Salut Jean. Je continue avec le Croco. - Code:
-
rem ================================================================= dim p,x,y
mode 3, "QUAND UN SINUS RENCONTRE UN COSINUS, ILS FONT LA BELLE",1000,800 : origin 500,400 p = pi/180 for x = -3*pi to 3*pi step p for y = -3*pi to 3*pi step p if cos(4*x) * cos(2*sqr(2)*(x-y)) * cos(4*y)*cos(2*sqr(2)*(x+y)) < 0 then ' if int(sin(x)+sin(y+sin(x))) = int(sin(y)+sin(x+sin(y))) then ' if cos(sin(x+sin(y+cos(x+sin(y)))) - cos(y+cos(x+sin(y+cos(x))))) > .999 then ' if (sin(y)*cos(x)-sin(x))*(sin(x)*cos(y)-sin(y)) > 0 : then ' if sin(x)*sin(y) >= cos(x)+cos(y) then pen rgb(255,255,0) else pen rgb(255,0,0) end_if plot 50*x,40*y next y next x
while inkey() = "" : wend end rem ====================================================================
| |
| | | Contenu sponsorisé
| Sujet: Re: Les programmes de papydall | |
| |
| | | | Les programmes de papydall | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |