/*col6.java
 *97/7/7
 *Suzuki,Tetsuo —é–Ø“O•v
 */


import java.applet.*;
import java.awt.*;
import java.lang.Math;

public class col6 extends Applet implements Runnable{
	Thread th=null;
	int n=50;
	int k=4;
	int x[]=new int[n];
	int y[]=new int[n];
	int dx[]=new int[n];
	int dy[]=new int[n];
	int r[]=new int[n];
	int i,j;
	int red,green,blue;
	Image buffer;
	Dimension d;
	Graphics g;
	public void init(){
                
		d=size();
		buffer=createImage(d.width,d.height);
		for(i=0;i<n;i++){
			red=255;green=0;blue=0;
			r[i]=3;
			r[0]=12; 
			x[i]=(int)(Math.random()*(d.width-2*r[i]));
			y[i]=(int)(80+Math.random()*(d.height-2*r[i]));
	       		dx[i]=(int)(Math.random()*13);
			if (0==(int)(Math.random()*2)) dx[i]=-dx[i];
	       		dy[i]=(int)(Math.random()*13);
			if (0==(int)(Math.random()*2)) dy[i]=-dy[i];
	        	}
		
		add(new Label("put less than 50  and push return key "));
 		add(new TextField("50",2));			
		add(new Label("        ratio of radius"));
		CheckboxGroup cg=new CheckboxGroup();
		add(new Checkbox("1:1",cg,false));
		add(new Checkbox("2:1",cg,false));
		add(new Checkbox("4:1",cg,true));
		add(new Label("               color"));
		CheckboxGroup cg2=new CheckboxGroup();
		add(new Checkbox("red",cg2,true));
		add(new Checkbox("green",cg2,false));
		add(new Checkbox("white",cg2,false));
		
	}

        void drawToBuffer(){
		Graphics g=buffer.getGraphics();
		 Color c=new Color(red,green,blue);
		g.setColor(Color.white);
		g.clipRect(0,80,d.width,d.height-80);
		g.fillRect(0,80,d.width,d.height-80);
		for(i=0;i<n;i++){
		if (i!=0) r[i]=(int)r[0]/k;
		if (i==0)g.setColor(Color.blue);
		else g.setColor(c);		
		g.fillOval(x[i],y[i],2*r[i],2*r[i]);
		}
	
	}
	void move (){
		
		int bx[]=new int[n];
		int by[]=new int[n];
		int bdx[]=new int[n];
		int bdy[]=new int[n];
		int b,a,aa,bb,dd,bdd;
		float s,t,p,q,u,v;

		for(i=0;i<n;i++){
			if (i!=0) r[i]=(int)r[0]/k;
			bx[i]=x[i];
			by[i]=y[i];
			bdx[i]=dx[i];
			bdy[i]=dy[i];
			x[i]=x[i]+dx[i];
			y[i]=y[i]+dy[i];
		if (x[i]<=0){x[i]=0;dx[i]=-dx[i];}
		if (x[i]>=d.width-2*r[i]){x[i]=d.width-2*r[i]; dx[i]=-dx[i];}
		if (y[i]<=80){y[i]=80;dy[i]=-dy[i];}
		if (y[i]>=d.height-2*r[i]) {y[i]=d.height-2*r[i];dy[i]=-dy[i];}
			}
		for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			a=x[j]-x[i]+r[j]-r[i] ;
			aa=bx[j]-bx[i]+r[j]-r[i];
			b=y[j]-y[i]+r[j]-r[i] ;
			bb=by[j]-by[i]+r[j]-r[i];
			dd=a*a+b*b;
			bdd=aa*aa+bb*bb;
		if (dd!=0&&dd<=(r[i]+r[j])*(r[i]+r[j])&&j!=i&&dd<bdd){
			s=(float)(r[i]*r[i]-r[j]*r[j])/(r[i]*r[i]+r[j]*r[j]);
			t=(float)2*r[j]*r[j]/(r[i]*r[i]+r[j]*r[j]);
			p=(float)(a*bdy[i]-b*bdx[i]);
	   	        q=(float)(s*(a*bdx[i]+b*bdy[i])+t*(a*bdx[j]+b*bdy[j]));
			u=(float)(a*q-b*p)/dd;
			v=(float)(b*q+a*p)/dd;
			if(u>0) u=(float)(u+0.4999996);else u=(float)(u-0.4999996);
			if(v>0) v=(float)(v+0.4999995);else v=(float)(v-0.4999995);	
			dx[i]=(int)u;
			dy[i]=(int)v;
			}
			}
		}	
	}

	
	public void start(){
		if (th==null){
			th=new Thread(this);
			th.start();
		}
	}
	public boolean action(Event e,Object o){
		if (e.target instanceof TextField){
			 n=Integer.parseInt((String) o);	
			}
		Checkbox ch=(Checkbox)e.target;
		if ("1:1".equals (ch.getLabel()))
			k=1;
		else if("2:1".equals (ch.getLabel()))
			k=2;
		else if("4:1".equals (ch.getLabel()))
			k=4;
		else if ("red".equals (ch.getLabel())){
			red=255;green=0;blue=0;
			}
	        else if("green".equals (ch.getLabel())){
			red=0;green=255;blue=0;
			}
		else if("white".equals (ch.getLabel())){
			red=255;green=255;blue=255;
			}	 
			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;
		}
	}
}
