import fr.upd.*;
/**
* Une « animation » illustrant la construction d'une approximation de la
* courbe dite du Dragon à l'aide d'un algorithme récursif.
* La courbe du Dragon est la limite de la réécriture itérative géométrique
* consistant à remplacer un segment (dirigé) par les deux côtés du
* triangle rectangle isocèle dont le segment initial est l'hypothénuse.
* Les deux segments obtenus sont dirigés de sorte que la direction « pointe »
* vers le sommet du triangle obtenu. On peut chercher sur Internet comment
* cette construction est obtenue par différents moyens.
*
* @author JBY
**/
public class Dragon {
/**
* La fonction de construction de la n-ième itération du Dragon.
*
* @param n nombre d'itérations à effectuer
* @param x0 abscisse du point d'origine du segment sur lequel itérer
* @param y0 ordonnée du point d'origine du segment sur lequel itérer
* @param l longueur du segment
* @param angle direction du segment
**/
public static void dragon(int n,int x0,int y0,double l,double angle) {
// calcul des coordonnées du point terminal du segment
// Trigonométrie élémentaire
int x1 = (int)(l*Math.cos(angle))+x0;
int y1 = (int)(l*Math.sin(angle))+y0;
if (n==0) { // plus rien à itérer, on dessine le segment
Facile.drawLine(x0,y0,x1,y1);
return;
}
// on doit encore itérer:
// la longueur des deux segments à traiter est en rapport racine(2) avec
// l'hypothénuse (Pythagore, au secours!).
l = l/Math.sqrt(2);
// itération sur le premier nouveau segment qui démarre au même point,
// a la nouvelle longueur calculée mais a une nouvelle direction de 45°
// par rapport à la précédente
dragon(n-1,x0,y0,l,angle+Math.PI/4);
// itération sur le second nouveau segement qui démarre au point terminal,
// a la nouvelle longueur calculée mais a une nouvelle direction de 45°+90°
// par rapport à la précédente.
dragon(n-1,x1,y1,l,angle+3*Math.PI/4);
return;
}
public static void main(String []a) {
// Ouvre une fenêtre de 900x900 pixels
Facile.startDrawings(900,900);
// On essaie de dessiner les 20 premières itérations
for (int i=0; i<20; i++) {
// On efface l'écran
Facile.clearArea();
// On passe en trait blanc
Facile.setGray(255);
// On calcule la i-ième itération du Dragon
dragon(i,200,450,600.0,0.0);
// On attend une demi-seconde
Facile.sleep(500);
}
// On attend 100 secondes.
Facile.sleep(100000);
// On ferme la fenêtre...
Facile.stopDrawings();
}
}