1.2 Algorithme
Si on se donne une fonction AVANCE telle que l’appel AVANCE(distance,angle) trace
une ligne de longueur distance dans la direction angle à partir du point courant, la définition
permet de donner directement l’algorithme 1.
Algorithme 1 : dessin du motif
MOTIF(generation,distance,angle) =
if generation =0then
AVANCE(distance,angle);
else
MOTIF(generation −1, distance/3, angle);
MOTIF(generation −1, distance/3, angle +π/3);
MOTIF(generation −1, distance/3, angle −π/3);
MOTIF(generation −1, distance/3, angle);
La complexité de cet algorithme se calcule donc récursivement de la manière suivante,
en notant Cnle nombre de lignes à tracer pour un motif de génération n:
C0=1
∀n≥0, Cn+1=4∗Cn
D’où Cn=4n.
1.3 Quelques pièges à éviter
1.3.1 Utilisation du type float
Les points de la fenêtre graphique sont repérés par des couples d’entiers. Or, pour dessi-
ner un flocon d’ordre relativement grand (n>5), la définition de l’écran est insuffisante, et
on doit dessiner des longueurs inférieures au pixel. Si la conversion f loat →int est effectuée
au mauvais moment, le flocon devient donc rapidement un point...
Une solution est d’utiliser des références sur des flottants pour repérer la position théo-
rique du point courrant, et de n’utiliser des entiers que dans les fonctions graphiques. Le
calcul se faisant entièrement sur des flottants, la déformation du flocon est locale, et il n’y
pas de problème de raccord.
1.3.2 Problème d’arrondis
En regardant à la loupe, nous avons observé une légère déformation locale : le flocon
n’était pas parfaitement symétrique. Cela était dû au fait que la fonction int_of_float donne
la partie entière d’un flottant, et non son arrondi. Il est donc nécessaire de créer une fonction
arr :f loat →int qui, appliquée à un flottant x, renvoie l’entier le plus proche de x.
3