debut: REM L-System Maker : un programme int‚gralement con‡u et r‚alis‚ par Th‚ophile, Pierre-Romain, Romain et Guillaume SCREEN 9 CLS CONST PI = 3.141592654# CONST resolution2 = (3456 / 2219) CONST resolution3 = (3072 / 2261) CONST resolution = (1180 / 875) CONST donlong = 400 CONST donlong2 = 360 DIM xcro!(4000) DIM ycro!(4000) DIM anglecro!(4000) DIM chainecro!(4000) cro% = -1 demonum% = 0 expl% = 0 iterationmax! = 0 REM presentation LOCATE 1, 29: COLOR 2: PRINT "L-System Maker" LOCATE 2, 5: COLOR 10: PRINT "par Dalens T., Delmotte P., Bertrand R., Converset G." LOCATE 1, 62: COLOR 7: PRINT "v5.0.X" LOCATE 5, 29: COLOR 4: PRINT "Faites votre choix :" LOCATE 7, 10: COLOR 15: PRINT "1/ Taper sa propre s‚quence" LOCATE 8, 10: PRINT "2/ Prendre une s‚quence existante" LOCATE 9, 10: PRINT "3/ D‚monstration" LOCATE 10, 10: PRINT "4/ Explication" LOCATE 11, 8: PRINT "Esc/ Quitter L-system Maker" LOCATE 12, 10: COLOR 4: PRINT "Tapez un, deux, trois, quatre ou escape" LINE (30, 205)-(590, 315), 1, BF LINE (70, 211)-(550, 309), 2, BF LINE (110, 217)-(510, 303), 5, BF LINE (150, 223)-(470, 297), 4, BF LINE (190, 229)-(430, 291), 9, BF LOCATE 19, 32: COLOR 15: PRINT "L-System Maker" PLAY "l15o2cdeg>c" key$ = "" WHILE key$ = "" key$ = INKEY$ WEND IF key$ = CHR$(27) THEN GOTO FIN IF key$ = "1" THEN etape1: REM ‚tape nø1 : demande des variables CLS COLOR 7, 0: INPUT " initiateur (utiliser 'F', '[', ']', '+' et '-') "; init$ IF init$ = "exit" GOTO debut COLOR 15: INPUT " g‚n‚rateur "; gener$ IF gener$ = "exit" GOTO debut COLOR 7: INPUT " abscisse de d‚part "; x0! COLOR 15: INPUT " ordonn‚e de d‚part "; y0! COLOR 7: INPUT " longueur de d‚part "; longueur0! COLOR 15: INPUT " facteur de longueur "; f! COLOR 7: INPUT " sens de '+' (D ou G par rapport … un axe vertical ascendant) "; sensp$ IF sensp$ = "exit" GOTO debut COLOR 15: INPUT " valeur de '+' (en degr‚s) "; plus! COLOR 7: INPUT " sens de '-' (D ou G) "; sensm$ IF sensm$ = "exit" GOTO debut COLOR 15: INPUT " valeur de '-'"; moins! COLOR 7: INPUT " angle de d‚part (selon sens trigonom‚trique) "; angle0! ELSE etape1bis: REM donn‚es d‚j r‚pertori‚es CLS LOCATE 2, 34: COLOR 15: PRINT " Choisissez une fractale." LOCATE 6, 9: COLOR 9: PRINT " 1/ Courbe de Koch" LOCATE 7, 9: COLOR 10: PRINT " 2/ Flocon de Koch" LOCATE 8, 9: COLOR 12: PRINT " 3/ Branche d'arbre" LOCATE 9, 9: COLOR 11: PRINT " 4/ PRRTGtemp" LOCATE 10, 9: COLOR 13: PRINT " 5/ La croix du Sud" LOCATE 11, 9: COLOR 14: PRINT " 6/ Variation de la courbe de Koch" LOCATE 12, 9: COLOR 12: PRINT " 7/ Branche d'arbre nø2" LOCATE 13, 9: COLOR 11: PRINT " 8/ Triangle de PRRTG" LOCATE 14, 7: COLOR 15: PRINT " Esc/ Retour au menu pr‚c‚dent" IF key$ = "3" THEN IF demonum% = 0 THEN demonum% = 1 key$ = "2" END IF IF demonum% = 2 THEN key$ = "7" END IF ELSE IF key$ = "4" THEN expl% = 100 key$ = "3" ELSE key$ = "" END IF END IF WHILE key$ <> "1" AND key$ <> "2" AND key$ <> "3" AND key$ <> "4" AND key$ <> "5" AND key$ <> "6" AND key$ <> "7" AND key$ <> "8" AND key$ <> CHR$(27) key$ = INKEY$ WEND IF key$ = "1" THEN REM donn‚es de la courbe de Koch init$ = "F" gener$ = "F+F-F+F" x0! = 30 y0! = 200 longueur0! = donlong f! = (1 / 3) sensp$ = "G" plus! = 60 sensm$ = "D" moins! = 120 angle0! = 0 couleur! = 9 iterationmax! = 5 END IF IF key$ = "2" THEN REM donn‚es du flocon de Koch init$ = "F-F-F" gener$ = "F+F-F+F" x0! = 120 y0! = 230 longueur0! = 240 f! = (1 / 3) sensp$ = "G" plus! = 60 sensm$ = "D" moins! = 120 angle0! = 60 couleur! = 10 iterationmax! = 5 END IF IF key$ = "3" THEN REM donn‚es de la branche d'arbre init$ = "F" gener$ = "F[+F]F[-F]F" x0! = 300 y0! = 295 longueur0! = 250 f! = (1 / 3) sensp$ = "G" plus! = 30 sensm$ = "D" moins! = 30 angle0! = 90 couleur! = 12 iterationmax = 4 END IF IF key$ = "4" THEN REM donn‚es de PRRTGtemp init$ = "F" gener$ = "F-F+FF+FF+FF+F+FFF" x0! = 60 y0! = 150 longueur0! = 300 f! = .25 sensp$ = "D" plus! = 90 sensm$ = "G" moins! = 90 angle0! = 0 couleur! = 11 iterationmax! = 3 END IF IF key$ = "5" THEN REM donn‚es de 'Croix du Sud' init$ = "F" gener$ = "F-F+F+F-F" x0! = 30 y0! = 240 longueur0! = donlong f! = (1 / 3) sensp$ = "D" plus! = 90 sensm$ = "G" moins! = 90 angle0! = 0 couleur! = 13 iterationmax! = 5 END IF IF key$ = "6" THEN REM donn‚es de la variation de la courbe de Koch init$ = "F" gener$ = "F[+F-F]FF" x0! = 30 y0! = 200 longueur0! = donlong f! = (1 / 3) sensp$ = "G" plus! = 60 sensm$ = "D" moins! = 120 angle0! = 0 couleur! = 14 iterationmax! = 5 END IF IF key$ = "7" THEN REM donn‚es de la branche d'arbre nø2 init$ = "F" gener$ = "F[+F]F[-F][--F]F" x0! = 300 y0! = 295 longueur0! = 250 f! = (1 / 3) sensp$ = "D" plus! = 30 sensm$ = "G" moins! = 30 angle0! = 90 couleur! = 12 iterationmax! = 4 END IF IF key$ = "8" THEN REM donn‚es du triangle de PRRTG init$ = "F++F++F" gener$ = "F+F--F+F-F++F-F+F--F+F" x0! = 130 y0! = 240 longueur0! = 240 f! = (1 / 7) sensp$ = "D" plus! = 60 sensm$ = "G" moins! = 60 angle0! = 60 couleur! = 11 iterationmax! = 3 END IF IF expl% = 100 THEN CLS SCREEN 9 LOCATE 3, 30: COLOR 12: PRINT "Lindenmayer-System" COLOR 15 LOCATE 5, 4: PRINT " Les L-System sont un moyen trŠs simple de r‚aliser des fractales." LOCATE 6, 2: PRINT " Il suffit d'imaginer une tortue (purement virtuelle) qui marche en" PRINT " laissant des traces derriŠre elle." PRINT " On repr‚sente la trajectoire de la tortue par une s‚quence de symboles." PRINT " La tortue tournera, avancera, r‚agira en fonction du symbole qu'elle" PRINT " voit. Pour d‚finir la s‚quence de symboles, deux donn‚es sont" PRINT " n‚cessaires :" PRINT " - l'initiateur (la premiŠre s‚quence de symbole que la tortue verra)" PRINT " Ici : l'initiateur est 'F'." PRINT " - le g‚n‚rateur : il s'agit de la s‚quence qui sera remplac‚e … chaque" PRINT " it‚ration. Ici, le g‚n‚rateur est 'F[-F]F[+F]F'. On a donc la formule :" PRINT " F --> F[+F]F[-F]F" PRINT "" PRINT " Appuyez sur une touche..." LOCATE 13, 31: COLOR 12: PRINT "F" LOCATE 15, 38: PRINT "F[+F]F[-F]F" LOCATE 16, 8: PRINT "F --> F[-F]F[+F]F" COLOR 15: LOCATE 15, 11: PRINT "-->" COLOR 10: LOCATE 15, 39: PRINT "[": LOCATE 15, 42: PRINT "]": LOCATE 15, 44: PRINT "[": LOCATE 15, 47: PRINT "]" LOCATE 16, 15: PRINT "[": LOCATE 16, 18: PRINT "]": LOCATE 16, 20: PRINT "[": LOCATE 16, 24: PRINT "]" COLOR 14: LOCATE 15, 40: PRINT "+": LOCATE 16, 16: PRINT "+": COLOR 9: LOCATE 15, 45: PRINT "-": LOCATE 16, 21: PRINT "-" key$ = "" WHILE key$ = "" key$ = INKEY$ WEND SCREEN 9 IF key$ = CHR$(27) GOTO debut IF key$ = CHR$(8) GOTO lblkey expl% = 101 END IF IF key$ = CHR$(27) GOTO debut REM fin de l'‚tape 1 bis : confirmation des donn‚es CLS IF couleur! = 9 THEN LOCATE 1, 28: COLOR 9: PRINT " Courbe de Koch" END IF IF couleur! = 10 THEN LOCATE 1, 28: COLOR 10: PRINT " Flocon de Koch" END IF IF couleur! = 12 THEN IF sensp$ = "G" THEN LOCATE 1, 28: COLOR 12: PRINT " Branche d'arbre" ELSE LOCATE 1, 28: COLOR 12: PRINT " Branche d'arbre nø2" END IF END IF IF couleur! = 11 THEN IF plus! = 90 THEN LOCATE 1, 31: COLOR 11: PRINT " PRRTGtemp" ELSE LOCATE 1, 28: COLOR 11: PRINT " Triangle de PRRTG" END IF END IF IF couleur! = 13 THEN LOCATE 1, 28: COLOR 13: PRINT " Croix du Sud" END IF IF couleur! = 14 THEN LOCATE 1, 20: COLOR 14: PRINT " Variation de la courbe de Koch" END IF LOCATE 3, 1: COLOR 15: PRINT " Initiateur :" PRINT " G‚n‚rateur :" PRINT " Facteur de longueur :" PRINT " Sens et valeur de '+' :" PRINT " Sens et valeur de '-' :" PRINT " Maximum d'it‚rations :" COLOR couleur! LOCATE 3, 15: PRINT init$ LOCATE 4, 15: PRINT gener$ LOCATE 5, 25: PRINT f! LOCATE 6, 26 IF sensp$ = "D" THEN PRINT "Droite," ELSE PRINT "Gauche," END IF LOCATE 6, 34: PRINT plus! LOCATE 7, 26 IF sensm$ = "D" THEN PRINT "Droite," ELSE PRINT "Gauche," END IF LOCATE 7, 34: PRINT moins! LOCATE 8, 25: PRINT iterationmax! lblkey: COLOR 15 IF demonum% = 0 THEN LOCATE 10, 1: PRINT " Appuyez sur escape pour annuler ou sur une autre touche pour continuer" labelkey: key$ = "" WHILE key$ = "" key$ = INKEY$ WEND IF key$ = CHR$(27) GOTO debut ELSE timera! = TIMER: WHILE TIMER < timera! + 4: WEND END IF END IF findeletape1: i! = -1 chaine$ = "/" + init$ + "/" longueur! = longueur0! retour% = -1 etape2: IF expl% = 102 OR expl% = 113 THEN CLS LOCATE 1, 30: COLOR 12: PRINT "It‚ration" COLOR 15 LOCATE 3, 1: PRINT " Comme … chaque it‚ration, le symbole 'F' est remplac‚ par la chaŒne" PRINT " suivante : F[+F]F[-F]F" PRINT " On a donc une nouvelle s‚quence." PRINT "" IF expl% = 102 THEN PRINT " Ancienne s‚quence : F" PRINT " Nouvelle s‚quence : F[+F]F[-F]F" ELSE PRINT " Ancienne s‚quence : F[+F]F[-F]F" LOCATE 7, 24: COLOR 9: PRINT "F": LOCATE 7, 27: COLOR 10: PRINT "F": LOCATE 7, 29: COLOR 11: PRINT "F": LOCATE 7, 32: COLOR 12: PRINT "F": LOCATE 7, 34: COLOR 13: PRINT "F" expli$ = "F[-F]F[+F]F": COLOR 15 PRINT " Nouvelle s‚quence :" LOCATE 9, 4: COLOR 15: PRINT SPACE$(11) + "[+" + SPACE$(11) + "]" + SPACE$(11) + "[-" + SPACE$(11) + "]" LOCATE 9, 4: COLOR 9: PRINT expli$ LOCATE 9, 17: COLOR 10: PRINT expli$ LOCATE 9, 29: COLOR 11: PRINT expli$ LOCATE 9, 42: COLOR 12: PRINT expli$ LOCATE 9, 54: COLOR 13: PRINT expli$ expl% = 200 END IF LOCATE 18, 1: COLOR 15: PRINT " Appuyez sur une touche..." key$ = "": WHILE key$ = "": key$ = INKEY$: WEND END IF angle! = angle0! x! = x0! y! = y0! REM ‚tpae nø2 : rempalecement de la chaŒne de caractŠres i! = i! + 1 IF i! = 0 AND retour% < 0 GOTO etape3 longueur! = f! * longueur! p% = 1 WHILE p% <> 0 p2% = p% p% = INSTR(p2%, chaine$, "F") IF p% <> 0 THEN gauche$ = LEFT$(chaine$, p% - 1) droite$ = RIGHT$(chaine$, LEN(chaine$) - p%) chaine$ = gauche$ + gener$ + droite$ p% = p% + LEN(gener$) END IF WEND retour% = retour% - 1 IF retour% > 0 GOTO etape2 etape3: REM ‚tape nø3 : construction de la figure l% = 1 CLS LOCATE 1, 1 COLOR 14 PRINT " L-System Maker par T.D., P-R.D., G.C., R.B. iteration i=" + STR$(i!) LOCATE 23, 1 IF demonum% = 0 THEN PRINT " Espace => prochaine it‚ration, Esc => quitter, Entr‚e => d‚but" ELSE IF demonum% = 1 THEN COLOR 10: PRINT " Flocon de Koch (d‚monstration)" ELSE : COLOR 12: PRINT " Branche d'arbre nø2 (d‚monstration)" END IF END IF COLOR 15 FOR l% = 1 TO LEN(chaine$) car$ = MID$(chaine$, l%, 1) IF car$ = "f" OR car$ = "F" THEN LINE (x!, y!)-(x! + (COS(angle! * PI / 180)) * longueur! * resolution, y! - (SIN(angle! * PI / 180)) * longueur!) x! = x! + (COS(angle! * PI / 180)) * longueur! * resolution y! = y! - (SIN(angle! * PI / 180)) * longueur! END IF IF car$ = "+" AND sensp$ = "G" THEN angle! = angle! + plus! END IF IF car$ = "+" AND sensp$ = "D" THEN angle! = angle! - plus! END IF IF car$ = "-" AND sensm$ = "G" THEN angle! = angle! + moins! END IF IF car$ = "-" AND sensm$ = "D" THEN angle! = angle! - moins! END IF IF car$ = "G" THEN angle! = angle! + 90! END IF IF car$ = "D" THEN angle! = angle - 90! END IF IF car$ = "[" THEN REM sauvegarde des variables cro% = cro% + 1 xcro!(cro%) = x! ycro!(cro%) = y! anglecro!(cro%) = angle! END IF IF car$ = "]" THEN REM rappel des variables x! = xcro!(cro%) y! = ycro!(cro%) angle! = anglecro!(cro%) cro% = cro% - 1 END IF IF expl% > 0 AND expl% < 113 AND car$ <> "/" THEN COLOR 9: LINE (285, 296)-(315, 296): COLOR 15 IF expl% = 101 THEN LOCATE 3, 65: COLOR 12: PRINT "'F'" END IF IF expl% > 101 AND expl% < 113 THEN LOCATE 3, 60: COLOR 15: PRINT "F[+F]F[-F]F" END IF IF expl% = 102 THEN : COLOR 12: LOCATE 3, 60: PRINT "F" IF expl% = 103 THEN : COLOR 10: LOCATE 3, 61: PRINT "[": LINE (285, 212)-(315, 212) IF expl% = 104 THEN : COLOR 14: LOCATE 3, 62: PRINT "+" IF expl% = 105 THEN : COLOR 12: LOCATE 3, 63: PRINT "F" IF expl% = 106 THEN : COLOR 10: LOCATE 3, 64: PRINT "]" IF expl% = 107 THEN : COLOR 12: LOCATE 3, 65: PRINT "F" IF expl% = 108 THEN : COLOR 10: LOCATE 3, 66: PRINT "[": LINE (285, 128)-(315, 128) IF expl% = 109 THEN : COLOR 9: LOCATE 3, 67: PRINT "-" IF expl% = 110 THEN : COLOR 12: LOCATE 3, 68: PRINT "F" IF expl% = 111 THEN : COLOR 10: LOCATE 3, 69: PRINT "]" IF expl% = 112 THEN : COLOR 12: LOCATE 3, 70: PRINT "F" LOCATE 23, 1: PRINT " " COLOR 15 key$ = "": WHILE key$ = "": key$ = INKEY$: WEND expl% = expl% + 1 END IF IF expl% > 199 THEN COLOR 9 IF expl% > 201 THEN COLOR 9 IF expl% > 212 THEN COLOR 10 IF expl% > 223 THEN COLOR 11 IF expl% > 235 THEN COLOR 12 IF expl% > 248 THEN COLOR 13 expl% = expl% + 1 IF i! > 2 THEN COLOR 15 expl% = 0 END IF END IF NEXT retour: REM retour … l'‚tape 2 IF demonum% = 0 THEN key$ = "" WHILE key$ = "" key$ = INKEY$ WEND retour% = -10 IF key$ = " " AND (i! < iterationmax! OR iterationmax! = 0) GOTO etape2 IF key$ = CHR$(27) THEN GOTO FIN IF key$ = CHR$(13) GOTO debut IF key$ = "0" OR (key$ = CHR$(8) AND i! = 1) THEN chaine$ = init$: x! = x0!: y! = y0!: angle! = angle0!: longueur! = longueur0!: i! = -1: GOTO etape2 END IF IF key$ = CHR$(8) AND i! > 1 THEN retour% = i! - 1: chaine$ = init$: x! = x0!: y! = y0!: angle! = angle0!: longueur! = longueur0!: i! = 0 GOTO etape2 END IF ELSE timera! = TIMER: WHILE TIMER < timera! + 2: WEND: IF i! < iterationmax! GOTO etape2 WHILE TIMER < timera! + 4: WEND IF demonum% = 1 THEN : demonum% = 2: key$ = "3": GOTO etape1bis GOTO debut END IF GOTO retour FIN: CLS COLOR 15 LOCATE 3, 1: PRINT " L-System Maker" PRINT "" PRINT " Par :" PRINT " BERTRAND Romain" PRINT " CONVERSET Guillaume" PRINT " DALENS Th‚ophile" PRINT " DELMOTTE Pierre-Romain" PLAY "o3c