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 :
n = 0 n = 1 n = 2

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.