import fr.upd.*;
/**
 * Une animation du triangle de Sierpinski obtenu par décomposition
 * récursive d'un triangle équilatéral en 4 triangles équilatéraux,
 * auxquels (sauf le triangle central) on applique jusqu'à plus soif
 * la même décomposition.
 * Ici on s'amuse en plus à faire tourner le triangle dans le cercle
 * dans lequel il est inscrit, et ce à intervalles réguliers.
 * L'autre jeu est de modifier la couleur d'affichage pour chaque
 * sous-triangle.
 * Le programme utilise la classe fr.udp.Facile
 * @author JBY
 */
public class Triangle {
  public static void sierp(int n,int []px,int []py) {
    // condition d'arrêt (profondeur de la récursion)
    if (n==0) {
      Facile.fillPolygon(px,py,3); // on dessine le triangle plein
      return;
    }
    int []ppx = new int[3];
    int []ppy = new int[3];
    // premier sous-triangle (P0,milieu(P0,P1),milieu(P0,P2))
    ppx[0] = px[0]; ppy[0] = py[0];
    ppx[1] = (px[0]+px[1])/2; ppy[1] = (py[0]+py[1])/2;
    ppx[2] = (px[0]+px[2])/2; ppy[2] = (py[0]+py[2])/2;
    Facile.setColor(255,0,0); // red
    sierp(n-1,ppx,ppy);

    // second sous-triangle (P1,milieu(P0,P1),milieu(P1,P2))
    ppx[0] = px[1]; ppy[0] = py[1];
    ppx[1] = (px[0]+px[1])/2; ppy[1] = (py[0]+py[1])/2;
    ppx[2] = (px[1]+px[2])/2; ppy[2] = (py[1]+py[2])/2;
    Facile.setColor(0,255,0); // blue
    sierp(n-1,ppx,ppy);

    // troisième sous-triangle (P2,milieu(P0,P2),milieu(P1,P2))
    ppx[0] = px[2]; ppy[0] = py[2];
    ppx[1] = (px[0]+px[2])/2; ppy[1] = (py[0]+py[2])/2;
    ppx[2] = (px[1]+px[2])/2; ppy[2] = (py[1]+py[2])/2;
    Facile.setColor(0,0,255); // green
    sierp(n-1,ppx,ppy);
  }
  public static void main(String []a) {
    // Ouverture d'une fenêtre de taille 900x900
    Facile.startDrawings(900,900);
    // Activer le noir pour les dessins
    Facile.setGray(0);
    int [] px = new int[3];
    int [] py = new int[3];
    int rayon = 400;
    double angle = 0.0;
    int n = 6;
    while (true) {
      // calcul initial des coordonnées du triangle de départ
      for (int i=0; i<3; i++) {
        px[i] = (int)(rayon*Math.cos(i*2*Math.PI/3+angle))+450;
        py[i] = (int)(rayon*Math.sin(i*2*Math.PI/3+angle))+450;
      }
      // on efface l'écran (remplissage en blanc)
      Facile.clearArea();
      // on applique 6 fois la "décomposition"
      sierp(n,px,py);
      // on temporise un peu pour ralentir l'animation
      Facile.sleep(100);
      // allez on fait "tourner" le triangle
      angle += Math.PI/360;
    }
  }
}