/*sin1.java
 *1997/7/7
 *Suzuki,Tetsuo —é–Ø“O•v
 */

import java.applet.*;
import java.awt.*;
import java.lang.Math;

public class sin1  extends Applet implements Runnable{
	Thread th=null;
	int x,y;
	int v;
	int dv;
	int av;
	int f;
	int r;
	Image buffer;
	Dimension d;
	
	public void init(){
		add(new Label("direction"));
		CheckboxGroup cg=new CheckboxGroup();
		add(new Checkbox("+x",cg,true));
		add(new Checkbox("-x",cg,false));
		add(new Label("speed"));
		CheckboxGroup cg1=new CheckboxGroup();
		add(new Checkbox("high",cg1,true));
		add(new Checkbox("low",cg1,false));
		add(new Checkbox("stop",cg1,false));
		add(new Label("scale"));
		CheckboxGroup cg2=new CheckboxGroup();
		add(new Checkbox("S",cg2,false));
		add(new Checkbox("L",cg2,true));
		//add(new Button("pause"));
		d=size();
		v=0;
		f=1;
		av=10;	
		dv=av;
		r=20;
		buffer=createImage(d.width,d.height);
	}

	void drawToBuffer(){
		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(Color.black);
		g.drawLine(120+r/2,30,120+r/2,d.height);
		g.drawLine(0,(int)(d.height/4)+r/2,d.width,(int)(d.height/4)+r/2);
		for (x=0;x<=d.width;x=x+r){
			y=(int)(-(d.height/8)*Math.sin((x-v)*3.1415*2/360)+(int)(d.height/4));	
		if (x==120)
		g.setColor(Color.red);
		else
		g.setColor(Color.blue);
		g.fillOval(x,y,r,r);
		}
		for (x=0;x<=d.width;x=x+2*r){
			y=(int)(40*Math.sin((x-v)*3.14159*2/360)+x+r/2);	
		if (x==120)
		g.setColor(Color.red);
		else
		g.setColor(Color.blue);
		g.fillRect(y,(int)(d.height*3/4)-3*r,r/2,7*r);
		
		}
	
	}
	void move (){
		dv=f*av;
		v=v+dv;
		
		
	}

	public void start(){
		if (th==null){
			th=new Thread(this);
			th.start();
		}
		
	}
	public boolean action(Event ev,Object o){
		/*Button b=(Button)ev.target;
		if ("start".equals (b.getLabel()))
			th.resume();
		else if ("stop".equals(b.getLabel()))
			th.suspend();*/
		Checkbox ch=(Checkbox)ev.target;
		if ("+x".equals (ch.getLabel()))
			f=1;
		else if("-x".equals (ch.getLabel()))
		        f=-1;
		else if ("high".equals (ch.getLabel()))
			av=10;	   
		else if("low".equals (ch.getLabel()))
			av=5;	
		else if("stop".equals (ch.getLabel()))
			av=0;	 
		else if ("S".equals (ch.getLabel()))
			r=10;	   
		else if("L".equals (ch.getLabel()))
			r=20;	 
		//try{Thread.sleep(5000);}
		//	catch(InterruptedException e){}
			return true;
		}	

	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;
		}
	}
}
