/*monk.java
 *1997/10/10
 *Suzuki,Tetsuo —é–Ø“O•v
 */


import java.applet.*;
import java.awt.*;
import java.lang.Math;

public class monk extends Applet implements Runnable{
	Thread th=null;
	
	int n=2;
	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 m[]=new int[n];
	int i,j,stp,kx,ky,v,p;
	double ang,k;
	Image buffer;
	Dimension d;
	Color aa =Color.blue;	
	Color bb =Color.red;
	Color cc =Color.blue;	
	public void init(){
		d=size();
		v=30;p=0;k=0.0;
		buffer=createImage(d.width,d.height);
		ang=0.6;
		
		for(i=0;i<n;i++){
			r[i]=7;
			r[0]=7;
			m[i]=r[i]*r[i];	 
			
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));			
	        	}
		add(new Button("set"));
		//add(new Label("direction"));
		CheckboxGroup cg0=new CheckboxGroup();
		add(new Checkbox("1",cg0,false));
		add(new Checkbox("2",cg0,true));
		add(new Checkbox("3",cg0,false));
		add(new Label("speed"));
		CheckboxGroup cg1=new CheckboxGroup();
		add(new Checkbox("low",cg1,true));
		add(new Checkbox("high",cg1,false));
		add(new Button("start"));
		
	}

	void drawToBuffer(){
		
		
		Graphics g=buffer.getGraphics();
		
		for(i=0;i<n;i++){
		if (i==0)g.setColor(Color.blue);
		else g.setColor(Color.red);		
		g.fillOval(x[i],y[i],2*r[i],2*r[i]);
		g.setColor(Color.black);
		g.drawLine(x[0]+r[0],y[0]+r[0],x[1]+r[1],y[1]+r[1]);
		
		g.setColor(bb);
		g.drawLine(r[0],(int)(d.height-r[1]-5),r[0]+(int)(3*v*Math.cos(ang)),
				(int)(d.height-r[1]-5-3*v*Math.sin(ang)));
		g.drawString("2",r[0]+(int)(3*v*Math.cos(ang)),
				(int)(d.height-r[1]-5-3*v*Math.sin(ang)));
		g.setColor(aa);
		g.drawLine(r[0],(int)(d.height-r[1]-5),r[0]+(int)(3*v*Math.cos(ang+0.2)),
				(int)(d.height-r[1]-5-3*v*Math.sin(ang+0.2)));
		g.drawString("1",r[0]+(int)(3*v*Math.cos(ang+0.2)),
				(int)(d.height-r[1]-5-3*v*Math.sin(ang+0.2)));
		g.setColor(cc);
		g.drawLine(r[0],(int)(d.height-r[1]-5),r[0]+(int)(3*v*Math.cos(ang-0.2)),
				(int)(d.height-r[1]-5-3*v*Math.sin(ang-0.2)));
		g.drawString("3",r[0]+(int)(3*v*Math.cos(ang-0.2)),
				(int)(d.height-r[1]-5-3*v*Math.sin(ang-0.2)));	
		
		}
		
	
	}
	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,q,u,v;
		for(i=0;i<n;i++){
			bx[i]=x[i];
			by[i]=y[i];
			dy[i]=dy[i]+p;
			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]<=0){y[i]=0;dy[i]=-dy[i]-p;}
		if (y[i]>=d.height-2*r[i]) {
			dx[0]=0;dy[0]=0;dx[1]=0;dy[1]=0;p=0;}
						}
		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)(m[i]-m[j])/(m[i]+m[j]);
			t=(float)2*m[j]/(m[i]+m[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.2);else u=(float)(u-0.2);
			if(v>0) v=(float)(v+0.2);else v=(float)(v-0.2);	
			dx[i]=(int)u;
	                dy[i]=-p+(int)v;**/
			x[0]=(int)((x[0]+x[1])/2);
			x[1]=x[0];
			y[0]=(int)((y[0]+y[1])/2);
			y[1]=y[0];	
			dx[0]=0;dy[0]=0;dx[1]=0;dy[1]=0;p=0;
			}
			}
		}	
	}

	
	public void start(){
		if (th==null){
			th=new Thread(this);
			th.start();
		}
	}
	public boolean action(Event ev,Object o){
		if (ev.target instanceof Button){
		Button b=(Button)ev.target;
		if ("set".equals (b.getLabel())){
			Graphics g=buffer.getGraphics();
			g.setColor(Color.white);
			g.clipRect(0,0,d.width,d.height);
			g.fillRect(0,0,d.width,d.height);
			p=0;

			for(i=0;i<n;i++){
			r[i]=7;
			r[0]=7;
			m[i]=r[i]*r[i];	 
			
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));			
	        	}
			
		        }
		 else if ("start".equals (b.getLabel())){
			Graphics g=buffer.getGraphics();
			g.setColor(Color.white);
			g.clipRect(0,0,d.width,d.height);
			g.fillRect(0,0,d.width,d.height);
			p=1;
			for(i=0;i<n;i++){
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));			
	        	}
		        }
			}
			
		if (ev.target instanceof Checkbox){
		Checkbox ch=(Checkbox)ev.target;
		if ("1".equals (ch.getLabel())){
			Graphics g=buffer.getGraphics();
			g.setColor(Color.white);
			g.clipRect(0,0,d.width,d.height);
			g.fillRect(0,0,d.width,d.height);
			p=0;k=0.2; 
			aa=Color.red;bb=Color.blue;cc=Color.blue;
			for(i=0;i<n;i++){
			r[i]=7;
			r[0]=7;
			m[i]=r[i]*r[i];	 
			
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));			
	        	
	        	}
			
			
			}
		 else if("2".equals (ch.getLabel())){
			Graphics g=buffer.getGraphics();
			g.setColor(Color.white);
			g.clipRect(0,0,d.width,d.height);
			g.fillRect(0,0,d.width,d.height);
		        k=0;p=0;
			aa=Color.blue;bb=Color.red;cc=Color.blue;
			for(i=0;i<n;i++){
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));		
			}
			}
		 else if ("3".equals (ch.getLabel())){
			Graphics g=buffer.getGraphics();
			g.setColor(Color.white);
			g.clipRect(0,0,d.width,d.height);
			g.fillRect(0,0,d.width,d.height);
			k=-0.2;p=0;
			aa=Color.blue;bb=Color.blue;cc=Color.red;
			for(i=0;i<n;i++){
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));		
			}
			}
		  if ("high".equals (ch.getLabel())){
			Graphics g=buffer.getGraphics();
			g.setColor(Color.white);
			g.clipRect(0,0,d.width,d.height);
			g.fillRect(0,0,d.width,d.height);
			v=40;	p=0;
			for(i=0;i<n;i++){
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));
			}
			}		   
		else if("low".equals (ch.getLabel())){
			Graphics g=buffer.getGraphics();
			g.setColor(Color.white);
			g.clipRect(0,0,d.width,d.height);
			g.fillRect(0,0,d.width,d.height);
			v=30;p=0;
			for(i=0;i<n;i++){
			x[0]=(int)(5*d.width/6);
			y[0]=(int)(d.height-2*r[1]-5-x[0]*Math.tan(ang));
			dx[0]=0;
			dy[0]=0;
			x[1]=0;
			y[1]=(int)(d.height-2*r[1]-5);
			dx[1]=p*(int)(v*Math.cos(ang+k));
			dy[1]=-p*(int)(v*Math.sin(ang+k));
			}
			}	
			}	
		 
		 
		try{Thread.sleep(100);}
			catch(InterruptedException e){}
			return true;
		}	
	
	

	public void run(){
		while(th !=null){
		move();
		drawToBuffer();		
		repaint();
		if (stp==1)th.stop();
		try {
				Thread.sleep(100);
			}
			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;
		}
	}
}
