/*Spring.java
 *1998/9/18
 *Suzuki,Tetsuo —é–Ø“O•v
 */


import java.applet.*;
import java.awt.*;
import java.lang.Math;

public class Spring extends Applet implements Runnable{
	Thread th=null;
	int v;
	int dv;
	int av;
	int f1,f2;
    int q;
	int l,ll,h,n;
    int r;
    int x,y,m,k,a,b,a1,b1;
    double lx,dx;
    Color cl =Color.blue;	
	Image buffer;
	Dimension d;
	
	public void init(){
		
	   	setLayout(new BorderLayout());
       	Panel p = new Panel();
       	p.setLayout(new GridLayout(1,10));
		p.add(new Button("Reset"));
        p.add(new Button("A=1"));
        p.add(new Button("A=2"));
		p.add(new Button("k=1"));
		p.add(new Button("k=4"));
	    p.add(new Button("m=1"));
        p.add(new Button("m=4"));
        p.add(new Button("Start"));  
       	p.add(new Button("Stop"));  
       	add("South", p);
		d=size();
		v=0;
		f1=1;f2=0;
        q=0;
		av=6;	
		dv=av;
		ll=(int)(d.width/2);
        r=16;n=15;
        a=0;x=50;y=(int)(2*d.height/5);b=1;a1=0;b1=1;k=1;m=1;
		buffer=createImage(d.width,d.height);
	}

	void drawToBuffer(){
        int i;
        lx=ll+a*Math.cos(2*3.14159*k*v/(360*m));
        l=(int)(lx+0);
        dx=lx/(4*n);
		Graphics g=buffer.getGraphics();
		g.setColor(Color.white);
		g.clipRect(0,30,d.width,d.height-30);
        
		g.fillRect(0,30,d.width,d.height-30);
        
        g.setColor(cl);
 		for(i=0;i<n;i++){
		
        g.drawLine((int)(x+(4*i)*dx),y,(int)(x+(4*i+1)*dx),y-r/2);
        g.drawLine((int)(x+(4*i+1)*dx),y-r/2,(int)(x+(4*i+2)*dx),y);
        g.drawLine((int)(x+(4*i+2)*dx),y,(int)(x+(4*i+3)*dx),y+r/2);
        g.drawLine((int)(x+(4*i+3)*dx),y+r/2,(int)(x+(4*i+4)*dx),y);
        }
        g.setColor(Color.blue);
        g.fillRect(x+l,y-r,m*2*r,2*r);
        g.setColor(Color.cyan);
        g.fillRect(x-5,y-r,5,2*r);
        g.fillRect(x-5,y+r,(int)(d.width-2*x),2*r);
       g.setColor(Color.pink);
        g.drawLine(x+ll,0,x+ll,d.height); 
		g.setColor(Color.blue);
		g.drawString("0",x+ll,y+r+10 );
		g.drawString("1",x+ll+80,y+r+10 );
	    g.drawString("2",x+ll+160,y+r+10 );
		g.drawString("-1",x+ll-80,y+r+10 );
        g.drawString("-2",x+ll-160,y+r+10 );
	}
	void move (){
		dv=q*av;
		v=v+dv;
       
	}

	public void start(){
		if (th==null){
			th=new Thread(this);
			th.start();
		}
		
	}

    public boolean action(Event e, Object o) {
        if(e.target instanceof Button) {
             if ("Reset".equals(o)) {
                 a=0;b=1;f2=0;av=6;v=0;k=1;m=1;
                r=16;q=0;a1=0;b1=1;
		return true;
             } 
	     if ("A=1".equals(o)) {
                a=80;b=1;f2=0;av=6;v=0;
                r=16;q=0;a1=0;b1=1;
		        
                 return true;
             }
             if ("A=2".equals(o)) {
                 a=160;b=1;f2=0;av=6;v=0;
                r=16;q=0;a1=0;b1=1;
                
                 return true;
             }
            
             if ("m=1".equals(o)) {
                b=1;f2=0;av=6;v=0;
                r=16;q=0;a1=0;b1=1;
		        m=1;
                 
                 return true;
             }
          if ("m=4".equals(o)) {
                b=1;f2=0;av=6;v=0;
                r=16;q=0;a1=0;b1=1;
		        m=2;
                 
                 return true;
             }
          if ("k=1".equals(o)) {
                b=1;f2=0;av=6;v=0;
                r=16;q=0;a1=0;b1=1;
		        k=1;cl=Color.blue;
                 
                 return true;
             }
           if ("k=4".equals(o)) {
                b=1;f2=0;av=6;v=0;
                r=16;q=0;a1=0;b1=1;
		        k=2;cl=Color.red;
                 
                 return true;
             }
            
	    
       	     
	    if ("Start".equals(o)) {
                 q=1;
                 
                 return true;
             }	
          if ("Stop".equals(o)) {
                 q=0;
                 
                 return true;
             }	
	    
		
             return true;
      }
      return super.handleEvent(e);
   }

	
	public void run(){
		while(th!=null){
		move();
		drawToBuffer();		
		repaint();
		try {
				Thread.sleep(20);
			}
			catch (InterruptedException e){}
		}
	}
        public void update(Graphics g){
		paint(g);
	}

	public void paint (Graphics g){
		g.drawImage(buffer,0,0,this);
	}
		
	
	public void stop(){
		if (th!=null){
			th.stop();
			th=null;
		}
	}
}
