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(); } }