import java.awt.*;
import java.applet.*;

public class Logistic extends Applet {
	LogControls lControls;
	LogCanvas lCanvas;

	public void init() {
		this.setBackground(Color.white);
		setLayout(new BorderLayout());

		add("Center", lCanvas = new LogCanvas());
		add("South", lControls = new LogControls(lCanvas));
		lCanvas.setControls(lControls);
	}

	public void start() {
		lControls.enable();
	}

	public void stop() {
		lControls.disable();
	}

	public boolean handleEvent(Event e) {
		if (e.id == Event.WINDOW_DESTROY) {
		System.exit(0);
		}
		return false;
	}

	public static void main(String args[]) {
		Frame f = new Frame("Logistic");
		Logistic log = new Logistic();

		log.init();
		log.start();

		f.add("Center", log);
		f.show();
	}
}
    

class LogCanvas extends Canvas {
    	private double lmin  = 1.0;
    	private double lmax  = 4.0;
	private LogControls lControls;

	public void setControls(LogControls lc) { lControls = lc; }

   	public void paint(Graphics g) {

		lControls.hide();

		g.setColor(Color.gray);
		g.drawLine(50, 300, 450, 300);
		g.drawLine(50, 300, 50, 1);

		g.setFont(new Font("TimesRoman", Font.PLAIN, 12));
		g.drawString("x = 0", 1, 300); 
		g.drawString("x = 1", 1, 10); 
		g.drawString("lambda = " + lControls.getMinText(), 50, 320); 
		g.drawString("lambda = " + lControls.getMaxText(), 380, 320); 

		g.setColor(Color.black);
		for (int i = 1; i <= 400; i++) {
			double lambda;
			double x = 0.315;
			int j;

			// x(n+1) = lambda x ( 1 - xn )

			lambda = lmin + (float)i /400.0f*(lmax-lmin);

			for (int k = 1; k < 500; k++) {
				x = lambda * x * (1.0 - x);
			}
			for (int k = 1; k < 100; k++) {
				x = lambda * x * (1.0 - x);
				j = 300-(int)(x*300.0);
				g.drawLine(50+i, j, 50+i, j+1);
			}
		}
		lControls.show();
	}

	public void redraw(double lmin, double lmax) {	
		this.lmin = lmin;
		this.lmax = lmax;
		repaint();
	}
}

class LogControls extends Panel {
	TextField tmin;
	TextField tmax;
	LogCanvas canvas;

	public LogControls(LogCanvas canvas) {
		this.canvas = canvas;

		setFont(new Font("TimesRoman", Font.BOLD, 14));
		add(new Label("min >= 1"));
		add(tmin = new TextField("1.0", 6));

		add(new Label("   max <= 4"));
		add(tmax = new TextField("4.0", 6));

		add(new Button("Redraw"));
	}


	private double getLambda(TextField t, double ldefault) {
		double lambda, lTyped;

		try {
			lTyped = Float.valueOf(t.getText().trim()).floatValue();
			lambda = Math.min(Math.max(lTyped,1.0),4.0);
			if (lTyped  != lambda)
				t.setText(""+lambda);
		} catch (NumberFormatException e) {
			lambda = Math.min(Math.max(ldefault,1.0),4.0);
			t.setText(""+lambda);
		}

		return lambda;
	}

	public String getMinText() {
		return tmin.getText().trim();
	}

	public String getMaxText() {
		return tmax.getText().trim();
	}

	public boolean action(Event ev, Object arg) {
		if (ev.target instanceof Button) {

			canvas.redraw(getLambda(tmin,1.0),getLambda(tmax,4.0));
			return true;
		}
		return false;
	}
}
	
