import fr.upd.*;
import java.awt.geom.*;

/**
 * Un programme pour dessiner le flocon de von Koch.
 * Il suffit de prendre un segment, le couper en trois partie égales,
 * supprimer le sous-segment central et le remplacer par un triangle
 * équilatéral (sans la base). La limite produit une courbe continue mais
 * non dérivable en tout point.
 *
 * Suggestions: Jouer avec les paramètres... Les angles, etc...
 * Essayer de ne pas utiliser getState() et setState() pour restaurer les
 * positions anciennes de la tortue, mais utiliser les instrutions de
 * saut, jumpTo()...
 * Transformer le programme de sorte à obtenir d'abord le dessin au niveau 1
 * puis après un certain temps, celui du niveau 2, etc. Afin d'illustrer
 * clairement l'effet des itérations successives.
 * Transformer le programme pour utiliser comme base n'importe quelle ligne
 * brisée définie par une liste de points du plan (au moins deux points).
 * Transformer le programme de sorte à arrêter la récursion lorsque la finesse
 * est en dessous du pixel.
 */
public class VonKoch {
  public static Turtle tortue;
  public static void vonKoch(int niveau,double longueur) {
    TurtleState s = tortue.getState();
    if (niveau==0) {
      tortue.lineTo(longueur);
    }
    else {
      vonKoch(niveau-1,longueur/3);
      tortue.jumpTo(longueur/3);
      double angle = Math.PI/3;
      /* décommenter pour introduire un petit facteur aléatoire sur le
       * côté choisi pour produire le triangle...
       */
      //if (Math.random()>0.5) {
      //  angle = -angle;
      //}
      tortue.rotate(angle);
      vonKoch(niveau-1,longueur/3);
      tortue.jumpTo(longueur/3);
      tortue.rotate(-2*angle);
      vonKoch(niveau-1,longueur/3);
      tortue.jumpTo(longueur/3);
      tortue.rotate(angle);
      vonKoch(niveau-1,longueur/3);
    }
    tortue.setState(s); // restore old place+angle
    /* décommenter pour avoir une vision incrémentale du
     * déroulement de l'algorithme.
     */
    //    Facile.sleep(1);
  }
  public static void main(String []args) {
    int max_level = 6;
    double l = 300.0;
    Facile.startDrawings(600,600);
    Facile.setGray(0);
    Facile.setTurtleMode(true);
    tortue = Facile.getTurtle();
    tortue.setLocation(100.0,200.0);
    tortue.setAngle(Math.PI/3);
    vonKoch(max_level,l);
    tortue.setLocation(Math.cos(Math.PI/3)*l+100,Math.sin(Math.PI/3)*l+200.0);
    tortue.setAngle(-Math.PI/3);
    vonKoch(max_level,l);
    tortue.setLocation(l+100,200);
    tortue.setAngle(-Math.PI);
    vonKoch(max_level,l);
  }
}