import java.awt.*;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.applet.Applet;

class point {
	
	double x, y;
	
	point( double x, double y )
	{
		this.x = x;
		this.y = y;
	}
}

class GoldenSquare extends java.applet.Applet
{
	

	point oxy = new point(10,10);
	
	int MAX=1;
	int SCALE=1;
	int SPIRAL=0;
	
	
	double phi = (Math.sqrt(5)-1)/2;
	
	public GoldenSquare( int niter, int nscale , int nspiral)
	{
		MAX = niter;
		SCALE = nscale;
		SPIRAL = nspiral;
		
	}

	/* main function which it draws */
	public void paint( Graphics g )
	{        
		Rectangle r = getBounds();
		g.clearRect( 0, 0, r.width, r.height );
		g.setColor( Color.black );
		draw( g, MAX, SCALE, SPIRAL );
                
	}
	
	double power(double base, int exponent) {
	
		double result = 1.0;
		for (int i=1;i<=exponent;i++){
				result *= base;
		}
		
		return result;
		
	}
	
	void square(Graphics g, point p1, point p2) {
		
		point a = new point(0,0);
		point b = new point(0,0);
		
		if (p1.x < p2.x) { a.x = p1.x; b.x = p2.x; } else { a.x = p2.x; b.x = p1.x; }
		if (p1.y < p2.y) { a.y = p1.y; b.y = p2.y; } else { a.y = p2.y; b.y = p1.y; }
			
		g.drawLine((int)a.x,(int)a.y,(int)b.x,(int)a.y);
		g.drawLine((int)b.x,(int)a.y,(int)b.x,(int)b.y);
		g.drawLine((int)b.x,(int)b.y,(int)a.x,(int)b.y);
		g.drawLine((int)a.x,(int)b.y,(int)a.x,(int)a.y);
		
	}
	
	void spiral (Graphics g, point p1, point p2, point s) {
	
			
			g.setColor(Color.red);

			double r=0.0;
			int kA=0;
						
			if (s.y == p1.y && s.x > p1.x) { kA = 180; r = s.x - p1.x; }
			if (s.y == p2.y && s.x < p2.x) { kA = 270; r = p2.x - s.x; }
			if (s.y == p1.y && s.x < p1.x) { kA = 0;   r = p1.x - s.x; }
			if (s.y == p2.y && s.x > p2.x) { kA = 90;  r = s.x - p2.x; } 
						
			point a = new point(s.x - r,s.y-r);
			
			g.drawArc((int)a.x, (int)a.y, (int)(2*r), (int)(2*r), kA, 90);	
			g.setColor(Color.black);
			
		
	}
	
	void draw( Graphics g, int MAX, int SCALE, int SPIRAL)
	{
		
		double ni = power(1.5,SCALE)+200;
		
		point p[] = new point [MAX+1];
		point s[] = new point [MAX+1];
		
		double gx = (phi)/(1 - phi*phi*phi*phi);
		double gy = (phi*phi)/(1 - phi*phi*phi*phi);
		
		double px = (400*gx)-gx*(ni + ni*phi);
		double py = (200*gy)-(ni - gy*(ni + ni*phi));
		
		
		p[0] = new point(px,py);
		s[0] = new point(px+ni,py);				
						
		//iterate loop
		for (int i=1; i<=MAX; i++) {
			
			p[i] = new point((p[i-1].y - s[i-1].y),(s[i-1].x - p[i-1].x));
			
			s[i] = new point((p[i].x*phi*phi + s[i-1].x),(p[i].y*phi*phi + s[i-1].y));
			
			p[i].x += s[i-1].x;
			p[i].y += s[i-1].y;
			
			square(g, p[i-1], p[i]);
			
			if (SPIRAL == 1) {
				spiral(g, p[i-1], p[i], s[i-1]);
			}

			
		}
		
	}
  
};

public class GoldenRatio extends Applet implements ItemListener
{
	Choice iterL, scaleL, spiralL;
	GoldenSquare tablet;
	int iter=1;
	int scale=1;
	int spiral=0;
	
	public void init()
	{        

		tablet = new GoldenSquare(iter,scale,spiral);
		
		iterL = new Choice();               
		for (int i=1; i<=70; i++)
			iterL.addItem( new Integer(i).toString() );
		
		scaleL = new Choice();
		for (int i=1; i<=80; i++)
			scaleL.addItem( new Integer(i).toString() );
		
		spiralL = new Choice();
		spiralL.addItem("hide");
		spiralL.addItem("show");
		
		setLayout( new BorderLayout() );
		
		Panel sPanel = new Panel();
		sPanel.setLayout( new FlowLayout() );
		sPanel.add( new Label("Iterate:") );
		sPanel.add( iterL );
		sPanel.add( new Label("Zoom:") );
		sPanel.add( scaleL );
		sPanel.add( new Label("Spiral:") );
		sPanel.add( spiralL );
		
		add( "South", sPanel );
		add( "Center", tablet );			
		iterL.addItemListener( this );
		scaleL.addItemListener( this );
		spiralL.addItemListener (this );
	}
	
	public void itemStateChanged( ItemEvent evt )
	{        
		
		if ( evt.getSource() == iterL ) {
			String s = evt.getItem().toString();
			iter = Integer.parseInt( s );
		}
		
		if ( evt.getSource() == scaleL ) {
			String s = evt.getItem().toString();
			scale = Integer.parseInt( s );
		}
		
		if ( evt.getSource() == spiralL ) {
			String s = evt.getItem().toString();
			if (s.equals("hide")) {
				spiral = 0;	
			} else {
				spiral = 1;	
			}
		}
		
		remove( tablet );
		tablet = new GoldenSquare(iter,scale,spiral);
		add( "Center", tablet );
		validate();
		
	}
};
