import fr.upd.*;

/**
 * Dessin du tapis de Sierpinski.
 * Cette classe utilise la classe Facile fournie par ailleurs (attention
 * celle-ci est en cours de modification, il ne faut l'utiliser qu'avec
 * parcimonie et précautions - en particulier le mode Tortue, lequel n'est
 * par utilisé ici).
 *
 * @author JBY
 */
public class Sierpinski {
  /**
   * La fonction approxime (avec une finesse choisie) le dessin du
   * tapis de Sierpinski (un objet fractal - voir Benoit Mandelbrot sur
   * Wikipédia par exemple - simple).
   * Pour l'obtenir, la méthode est aisée. Partant d'un carré, le diviser en
   * 9 carrés égaux, évider celui du centre et recommencer l'opération sur les
   * 8 carrés l'entourant, jusqu'à épuisement...
   *
   * Exercice : le code possède un problème d'arrondi. Sauriez-vous
   * corriger le défaut ?
   * Exercice : modifier le code de sorte que le critère d'arrêt ne soit pas
   * un *niveau* de récursion mais un critère de taille de dessin...
   */
  public static void sierpinski(int n,int x,int y,int l,int h) {
    if (n==0) return;
    // Calcul de la taille des sous-carrés
    l = l/3;
    h = h/3;
    Facile.fillRect(x+l,y+l,l,h);
    // Les trois sous-carrée supérieurs
    sierpinski(n-1,x,y,l,h);
    sierpinski(n-1,x+l,y,l,h);
    sierpinski(n-1,x+2*l,y,l,h);
    // Les trois sous-carrés inférieurs
    sierpinski(n-1,x,y+2*h,l,h);
    sierpinski(n-1,x+l,y+2*h,l,h);
    sierpinski(n-1,x+2*l,y+2*h,l,h);
    // Les  sous-carrés gauche et droit
    sierpinski(n-1,x,y+h,l,h);
    sierpinski(n-1,x+2*l,y+h,l,h);
  }
  public static void main(String []args) {
    // Ouvre une fenêtre
    Facile.startDrawings(800,800);
    // Utilise le crayon noir
    Facile.setGray(0);
    // Go for it, baby!
    sierpinski(6,0,0,800,800);
  }
}