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