CODE SOURCE DU PROGRAMME

   
     
 

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.

 
     
         

Site gratuit (aide) | Mathematique | Petites annonces | A visiter | Forum Mathematique | Carte de voeux | Infos légales