Fractales :
Amusons-nous un peu
Dans ce TD, nous allons dessiner quelques fractales en utilisant la librairie
graphique de Caml. D'abord, nous créons pour simplifier les choses une
petite librairie qui simule le déplacement de la tortue du logo, puis
nous l'utilisarons pour dessiner quelques fractales connues : le triangle de
Sierpinski, le flocon de Von Koch, la courbe de Hilbert et la courbe du dragon.
Principes
Les fractales que nous allons voir sont définies par la limite d'un procédé
récursif de fabrication : un segment est remplacé par un motif composé lui-même
de plusieurs segments de taille inférieure, ensuite chacun de ces segments est
à nouveau remplacé par ce motif et ainsi de suite. Chaque itération supplémentaire
correspond à une nouvelle courbe, de rang supérieur. La fractale correspond à
l'ensemble des points contenus dans l'intersection de ces courbes.
On ne peut évidement pas vraiment tracer cette fractale, mais on peut tracer
chacunes des courbes intermédiaires au rang n voulu, et si n est assez grand,
alors on obtient une bonne image de la fractale.
1 La Tortue
Pour tracer les graphiques, nous utilisons une ``tortue'' virtuelle. Elle
porte le crayon (levé ou baissé), elle peut tourner à gauche ou à
droite d'un angle donné (en degrés) et avancer sur une distance
donnée.
Son état est stocké dans des variables globales :
let turtle_x = ref 0.0
and turtle_y = ref 0.0
and turtle_h = ref 0.0
and turtle_p = ref false;;
Question 1
Écrire les procédures forward : float -> unit
qui fait avancer la
tortue du nombre de pixel demandé, turn : float -> unit
qui fait
tourner la tortue de l'angle en degré indiqué, up
et down
qui lève et abaisse le crayon et enfin clear_screen
qui efface
l'écran et initialise l'état de la tortue au centre de l'écran, cap
vers le haut.
2 La courbe de Sierpinski
Cette courbe est une variation sur le flocon appelée la ``pointe de
flèche'' de Sierpinski. Le motif de degré 0 est un segment de droite.
Le motif de degré 1 est fait de segments de droite de même longeur
(égale à la moité de la longueur du segment de degré 1) disposés de la manière
suivante:
. La pente des deux segments
obliques est exactement 60°, la longueur entre le point de départ et le point
d'arrivée est bien de 2 fois la longueur de chaque segment.
Attention, dans cette courbe, le motif de rang 2 est :
Les motifs qui remplacent chaque segment du motif de rang 1 ne se placent pas
tous dans le même sens : vers le bas pour les segments obliques, vers le haut
pour le segment horizontal.
Question 2
Écrire une procédure récursive qui trace la courbe de Sierpinski. Elle prendra
en argument l'angle a de départ (+60° ou -60°), la longueur d du
segment dans laquelle elle doit tracer la courbe, et n, le rang de la
courbe qu'elle doit tracer.
Question 3
Quelle fractale connue reconnaissez-vous ?
3 Le flocon de Von Koch
Le principe est toujours le même, mais cette fois, le motif de rang 1 est le
suivant :
.
Cette fois-ci, un segment de longueur d est remplacé par 4 segments de longueur
d/4, l'angle des segments obliques est encore de 60°.
Question 4
Écrire une procédure récursive qui trace la courbe de Von Koch. Elle prendra
en argument la longueur d du segment dans laquelle elle doit tracer
la courbe, et n, le rang de la courbe qu'elle doit tracer.
Le flocon de Von Koch est constitué de 3 fois cette courbe placé sur les côtés
d'un triangle équilatéral.
Question 5
Écrire une procédure qui trace un flocon de Von Koch complet au rang n
donné.
4 La courbe de Hilbert
La courbe de Hilbert montre comment une courbe peut ``remplir'' une surface
sans jamais se recouper.
La génération est un tout petit peu différente, cette fois-ci, le motif
ne remplace pas tous les segments de l'ordre précédent. Voici quelques
exemples de génération :
Question 6
Écrire une procédure récursive qui trace la courbe de Hilbert. Elle prendra
en argument l'angle a de départ (+90° ou -90°), la longueur d
du segment dans laquelle elle doit tracer la courbe, et n,
le rang de la courbe qu'elle doit tracer.
5 La courbe du dragon
La courbe du dragon est fondé sur un motif particulièrement simple :
, deux segments de longueur d/2
inclinés à 45° remplacent un segment de longueur d.
Attention, comme pour la courbe de Sierpinski, les motifs ne sont pas placés
dans le même sens selon le segment qu'ils remplacent, comme on peut le voir sur
la génération au rang 2 :
.
Question 7
Écrire une procédure récursive qui trace la courbe du dragon. Elle prendra
en argument l'angle a de départ (+45° ou -45°), la longueur d
du segment dans laquelle elle doit tracer la courbe, et n,
le rang de la courbe qu'elle doit tracer.
This document was translated from LATEX by
HEVEA.