Voici le code source de L-System Maker.
Notre programme a été réalisé en basic à l’aide du logiciel QuickBasic fonctionnant sous MS-DOS.
Ce code a été modifié et allégé pour des soucis de présentation : en effet, seul l’essentiel du programme a été gardé.
Les commentaires seront inscrits en bleu et en rouge.
SCREEN 9
CLS
CONST PI = 3.141592654#
Cette constante est nécessaire pour l’interface graphique et permet d’éviter d’avoir des images apparaissant comme aplaties.
CONST resolution = (3456 / 2219)
Création des tableaux de variables et des variables simples :
DIM xcro!(4000)
DIM ycro!(4000)
DIM anglecro!(4000)
DIM chainecro!(4000)
cro% = -1
demonum% = 0
Le menu de présentation a ici été supprimé.
La boucle suivante, revenant souvent dans le programme, sert à identifier la touché appuyée par l’utilisateur du programme.
key$ = ""
WHILE key$ = ""
key$ = INKEY$
WEND
IF key$ = CHR$(27) THEN GOTO fin
Etape 1 : l’ordinateur prend toutes les données nécessaires à la réalisation de la fractale.
IF key$ = "1" THEN
Si la touché appuyée est “1”, l’ordinateur demande, à l’aide d’une série de commandes INPUT, toutes les variables nécessaires à la construction de la fractale : les coordonnées de départ de la fractale (x0! et y0!), la longueur d’un trait (longueur0!), le facteur par lequel on multiplie la longueur à chaque itération (f!), les sens et valeurs des angles (sensp$, sensm$, plus! moins!), l’angle de départ (angle0!), l’initiateur (init$) et le générateur (gener$).
ELSE
Si la touche appuyée est 2 ou 3, l’ordinateur pioche les variables dans sa base de données.
Si l’utilisateur a choisi la démonstration, une valeur est inscrite dans la variable demonum%. L’ordinateur choisit ensuite les données correspondant au flocon de Koch ou à la branche d’arbre n°2, selon la valeur inscrite dans demonum%.
IF key$ = "3" THEN
IF demonum% = 0 THEN
demonum% = 1
key$ = "2"
END IF
IF demonum% = 2 THEN
key$ = "7"
END IF
ELSE key$ = ""
END IF
Si l’utilisateur a décidé de choisir lui-même sa fractale, un menu de présentation s’affiche et le code suivant lui permet de choisir sa fractale.
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$ = CHR$(27) GOTO debut
Les données de la fractale choisie sont ensuite inscrites dans la mémoire de l’ordinateur. En terme de taille, ceci constitue le plus gros du programme. L’ordinateur demande ensuite si on veut voir les données des fractales (et ce à l’aide de PRINT, LOCATE et COLOR) et demande la confirmation de l’utilisateur.
i! , variable représentant le nombre d’itérations, est définie sur –1.
i! = -1
longueur! = longueur0!
Etape 2 : Remplacement de « F » par le générateur
angle! = angle0!
x! = x0!
y! = y0!
i! = i! + 1
Si le nombre d’itérations est nul, cette étape est inutile, et le programme passé directement à l’étape 3.
IF i! = 0 […] GOTO etape3
La longueur est multipliée par le facteur de longueur :
longueur! = f! * longueur!
Le code suivant est indispensable : il permet de remplacer le « F » par le générateur. Pour cela, l’ordinateur recherche, dans la chaîne de caractères, la lettre « F ». Une fois trouvée, le programme prend tous les caractères se trouvant avant le « F » et y ajoute le générateur et tout se trouvant après le « F ».
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
Etape 3 : construction de la figure
CLS
Pour chaque caractère de la chaîne de caractère, le programme analyse le caractère.
FOR l% = 1 TO LEN(chaine$)
car$ = MID$(chaine$, l%, 1)
IF […] car$ = "F" THEN
Si celui-ci est un “F”, le programme trace un trait.
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
S’il s’agit d’un plus ou d’un moins, le programme change l’orientation des traits suivants.
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$ = "[" THEN
Si le programme rencontre un crochet ouvert, il sauvegarde certaines données de la courbe.
cro% = cro% + 1
xcro!(cro%) = x!
ycro!(cro%) = y!
anglecro!(cro%) = angle!
END IF
IF car$ = "]" THEN
Si le programme rencontre un crochet fermé, il rappelle les variables sauvegardées.
x! = xcro!(cro%)
y! = ycro!(cro%)
angle! = anglecro!(cro%)
cro% = cro% - 1
END IF
NEXT
Ensuite le programme retourne à l’étape n°2.
Si le programme n’est pas en mode démonstration, l’utilisateur doit appuyer sur la touche espace pour passer à l’itération suivante :
IF demonum% = 0 THEN
key$ = ""
WHILE key$ = ""
key$ = INKEY$
WEND
IF key$ = " " GOTO etape2
Sinon, le programme attend 2 secondes avant de passer à la prochaine itération.
ELSE timera! = TIMER: WHILE TIMER < timera! + 2: WEND: IF i! < iterationmax! GOTO etape2
Note : la variable iterationmax! Permet de vérifier à quelle itération la chaîne de caractères dépassera la capacité maximale autorisée par le logiciel QuickBasic. Si le programme en est à la dernière itération autorisée, le programme attend 2 secondes supplémentaires avant de changer de fractale ou de redémarrer le programme.
WHILE TIMER < timera! + 4: WEND
IF demonum% = 1 THEN : demonum% = 2: [retour à l’étape 1 pour rependre d’autres données]
GOTO debut
END IF
La fin termine le programme en affichant les noms de ses concepteurs.