import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class ProgrammApplet_TEST extends ProgrammApplet {
  static final int MIN = 0;
  static final int MAX = 255;
  static final double MIN_SIZE = 1.1;
  static final double minimum = 10;
  static final boolean noDown = true;
  static final boolean noUp = true;
  static int max_x, max_y;
  public Graphics can = null;

  public void initialisieren() {
    addFeld("k:", "1");
    addFeld("n:", "1");
    addArea("Ausgabe", 20, 20);
  }

  public void ausfuehren (Graphics g) {
    int k;
    putArea("Ausgabe", Integer.toString(k = getInt("k:")) + "\n");
    u_it(k, getInt("n:"));
    
    max_x = getWidth();
    max_y = getHeight();
    can = g;
    can.drawString(Integer.toString(max_x) + " = Width, " + Integer.toString(max_y) + " = Height", 10, 20);
    drawFraktalesPlasma(0, 0, getWidth(), getHeight(), (int)(MAX*Math.random()), (int)(MAX*Math.random()),
                                                       (int)(MAX*Math.random()), (int)(MAX*Math.random()), 512);
    can = null;
  }

  public int u_it(int k, int n) {
    int a = k;
    for (int i = 0; i < n; i++) {
      if (a % 2 == 0)
        a /= 2;
      else
        a = 3*a + 1;
      appendArea("Ausgabe", Integer.toString(a) + "\n");
    }
    return a;
  }
  
  public void drawFraktalesPlasma(int x1, int y1, int x2, int y2,
                                  int h1, int h2, int h3, int h4, int rough) {
    // Mittelwerte
    int rHalf = (int)(rough/2);
    int mid   = (int)((h1 + h2 + h3 + h4) / 4 + rough*Math.random() - rHalf);
    int xmed  = (int)((x1+x2)/2), ymed = (int)((y1+y2)/2);
    int h1h2  = (int)((h1+h2)/2), h1h3 = (int)((h1+h3)/2);
    int h2h4  = (int)((h2+h4)/2), h3h4 = (int)((h3+h4)/2);

    // Gegen "Leaks"
    if (noUp && (mid > MAX))
      mid = MAX - (mid % MAX);
    else if (noDown && (mid < MIN))
      mid = MIN + Math.abs(mid % MAX);

    if ((x1 < max_x) && (y1 < max_y)) {
      int width = x2-x1, height = y2-y1;
      if (Math.abs(width * height) >= minimum) {
        drawFraktalesPlasma(x1, y1, xmed, ymed, h1, h1h2, h1h3, mid, rHalf);
        drawFraktalesPlasma(xmed, y1, x2, ymed, h1h2, h2, mid, h2h4, rHalf);
        drawFraktalesPlasma(x1, ymed, xmed, y2, h1h3, mid, h3, h3h4, rHalf);
        drawFraktalesPlasma(xmed, ymed, x2, y2, mid, h2h4, h3h4, h4, rHalf);
      } else {
        can.setColor(new Color(mid));
        can.fillRect(x1, y1, width, height);
      }
    }
  }
}

