Devoir en groupe 1 :
Le flocon de Von Koch
Les tours de Hanoï
Pierre Chatelain Matthieu Perrin
5 octobre 2009
1 Le flocon de Von Koch
On souhaite réaliser une représentation du flocon de Von Koch en CamL. Après avoir
défini cette fractale, nous présenterons l’algorithme et sa complexité, puis nous cherche-
rons à améliorer la figure obtenue en supprimant les artefacts dus à certaines particularités
d’OCamL. Enfin, nous proposerons quelques variantes de ce problème.
1.1 Définition
Cette figure est une fractale définie à partir du motif de base suivant :
FIG. 1 – motif de base
À la génération 0, on avance simplement de la longueur distance. À la génération n>0,
on trace quatre morceaux de génération n1 en suivant ce motif. Pour obtenir le flocon
complet, il suffit alors de tracer 3 fois le motif, en tournant à chaque fois d’un angle de 2π
3.
Un exemple est donné figure 2.
1
FIG. 2 – flocon de génération 5
2
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
n0, Cn+1=4Cn
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
1.4 Quelques variantes...
1.4.1 Flocons tordus
En modifiant l’angle du motif de base, on obtient des formes diverses, plus lisses si
l’angle diminue, et plus découpées si l’angle se rapproche de π
2:
FIG. 3 – angle =π
10
FIG. 4 – angle =π
4
FIG. 5 – angle =3π
7
FIG. 6 – angle =10π
21
1.4.2 Remplissage du flocon
On peut également chercher à remplir le flocon. Pour cela, une possibilité est de remplir
d’un bloc le triangle interne, puis de dessiner le flocon avec un algorithme similaire à l’algo-
rithme 1, dans lequel on ajoute à chaque appel le remplissage du triangle apparaissant dans
le motif. Plus concrètement, le motif de base devient :
4
FIG. 7 – motif plein
Le résultat n’est pourtant pas totalement satisfaisant : on voit sur la figure 8 qu’il manque
certains pixels. L’algorithme de remplissage reste donc encore à améliorer...
FIG. 8 – flocon plein
5
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !