import java.awt.*;

public class PythagorasTree extends java.applet.Applet {
  /* phi ist einer der Winkel der entstehenden Dreiecke,
   * tan (phi) kann etwa zwischen 0.5 und 1.1 variiert
   * werden, um zu verwertbaren Bildern zu gelangen.
   */
  double tanphi = 1.1; // dauert zwar länger, aber sieht schöner aus
  static int rot_s = 0;

  /**
   * Die eigentliche Zeichenroutine
   */
  public void paint (Graphics g) {
    g.clearRect (0, 0, 500, 500);

    // es wird jetzt zusätzlich auch noch die Farbe übergeben (r,g,b,alpha)
    paintTree (g, 200, 400, 300, 400, 0, 0, 160, 255);
  }

  /**
   * rekursive Pythagoras-Funktion
   */
  void paintTree (Graphics g, double x1, double y1,
  double x2, double y2, int rot, int gruen, int blau, int alpha ) {
    // (1) Eckpunkte bestimmen
    double dx = x2 - x1;
    double dy = y1 - y2;
    double x3 = x1 - dy;
    double y3 = y1 - dx;
    double x4 = x2 - dy;
    double y4 = y2 - dx;

    // (2) vollständiges Quadrat zeichnen
/*
    g.drawLine ((int)x1, (int)y1, (int)x2, (int)y2);
    g.drawLine ((int)x2, (int)y2, (int)x4, (int)y4);
    g.drawLine ((int)x4, (int)y4, (int)x3, (int)y3);
    g.drawLine ((int)x1, (int)y1, (int)x3, (int)y3);
*/
    // habe die Linien durch ein gefülltest Polygon ersetzt. Ich finde das sieht schöner aus.
    // außerdem wird dem Ding jetzt auch mal 'ne Farbe gegeben...
    g.setColor(new Color(rot_s,gruen,blau,alpha));
    g.fillPolygon(new int[] {(int)x1,(int)x2,(int)x4,(int)x3}, new int[] {(int)y1,(int)y2,(int)y4,(int)y3}, 4);

    // (3) Koordinaten des neuen Eckpunktes errechnen
    double v = (x3 + x4) / 2 - (dy / 2 * tanphi);
    double w = (y3 + y4) / 2 - (dx / 2 * tanphi);

    if  (dx * dx + dy * dy > 2) {
      // hier werden die Farben variiert

      // rot wird immer stärker...
      rot_s = (rot_s + 255 + 2) % 255;

      // blau wird dagegen abgeschwächt...
      blau = 255-rot_s;

      // der Baum wird nach außen hin ausgeblendet...
      alpha = Math.abs((int)(( dx / (580-420) )*255));

      // (4) kleine Teilbäume zeichnen
      paintTree (g, x3, y3, v, w, rot, gruen, blau, alpha);
      paintTree (g, v, w, x4, y4, rot, gruen, blau, alpha);
    }
  }
}
