import fr.upd.*;
import java.util.*;

public class Arbre {
  public static Random r = new Random();
  // Un «arbre» est défini par la position de sa "racine", la longueur de son
  // tronc et l'orentation de son tronc 
  public static void arbre(int x,int y,int longueur, double angle) {
    // un trop petit tronc correspond à une feuille (bout de la récursion)
    if (longueur<=2) {
      Facile.setColor(0,255,0); // vert
      Facile.fillCircle(x,800-y,10);
      Facile.setColor(0,0,0); // noir
      return;
    }
    // coordonnées de la fin du tronc
    int xf = (int)(x+longueur*Math.cos(angle));
    int yf = (int)(y+longueur*Math.sin(angle));
    Facile.drawLine(x,800-y,xf,800-yf);
    
    // la «branche» gauche est un «arbre» plus court qui part de la fin du tronc
    // arbre(xf,yf,longueur*2/3,angle+Math.PI/4);
    // version avec un peu d'aléatoire pour la longueur
    double coef = r.nextDouble()*(2.0/3-1.0/2)+1.0/2;
    arbre(xf,yf,(int)(longueur*coef),angle+Math.PI/4);

    // la «branche» droite est un «arbre» plus court qui part de la fin du tronc
    // arbre(xf,yf,longueur*2/3,angle-Math.PI/4);
    // version avec un peu d'aléatoire pour la longueur
    coef = r.nextDouble()*(2.0/3-1.0/4)+1.0/4;
    arbre(xf,yf,(int)(longueur*coef),angle-Math.PI/4);

    // le «tronc» continue en plus court...
    // arbre(xf,yf,longueur*2/3,angle);
    // version avec un peu d'aléatoire pour la longueur
    coef = r.nextDouble()*(2.0/3-1.0/4)+1.0/4;
    arbre(xf,yf,(int)(longueur*coef),angle);
  }
  public static void main(String a[]) {
    Facile.startDrawings(800,800); // fenêtre de 800x800
    Facile.setColor(255,255,255); // blanc
    Facile.clearArea(); // effacement de la fenêtre
    Facile.setColor(0,0,0); // noir
    arbre(400,0,200,Math.PI/2); // un arbre...
  }
}