/*Doppler.java
 *1998/1/11
 *Suzuki,Tetsuo —é–Ø“O•v
 */

import java.applet.*;
import java.awt.*;
import java.lang.Math;

public class Doppler extends Applet implements Runnable{
	Thread th=null;
	int m=40;
	int n=0;
	int k=0;
	int l=0;
	int x[]=new int[m];
	int r[]=new int[m];
	int s[]=new int[m];
	int i,vs,vo,pvo,p,q,wl,j,ss,pp,qq,xx;
	Image buffer;
	Dimension d;
	
	public void init(){
		d=size();
		buffer=createImage(d.width,d.height);
		for (i=0;i<m;i++){
		r[i]=3;
		s[i]=0;
		x[i]=500;
		}
		p=0;
		q=500;
		s[0]=0;
		x[0]=0;
		vs=5;
		ss=0;
		pp=0;
 
        	setLayout(new BorderLayout());
       	 	Panel p = new Panel();
        	p.setLayout(new GridLayout(1,10));
		p.add(new Button("Reset"));
		p.add(new Button("v=0"));
		p.add(new Button("v<c"));
		p.add(new Button("v=c"));
        	p.add(new Button("v>c"));
		p.add(new Button("vo=0"));
		p.add(new Button("vo<0"));
		p.add(new Button("vo>0"));
        	p.add(new Button("Start")); 
        	p.add(new Button("Stop"));      
        	add("North", p);
		
		
		
	}

	void drawToBuffer(){
		Graphics g=buffer.getGraphics();
		g.setColor(Color.white);
		g.clipRect(0,0,d.width,d.height);
		g.fillRect(0,0,d.width,d.height);
		g.setColor(Color.blue);
		g.drawString("Observer",d.width/2-20,d.height/2+20 );
		g.setColor(Color.red);
		g.drawString("Source",d.width/2-120,d.height/2+20 );
		for(i=0;i<m;i++){		
		g.drawOval(d.width/2-100-r[i]+x[i],d.height/2-r[i],2*r[i],2*r[i]);}	
		for(i=0;i<m;i++){	
		g.fillOval(d.width/2-100-q-pp-3-1000*p+x[i],d.height/2-3,6,6);}
		for(i=0;i<m;i++){
		if (r[i]<=3&&r[i]>=2&&p==1){
		g.fillOval(d.width/2-100-r[i]+x[i],d.height/2-r[i],2*r[i],2*r[i]);
		}
		}
		g.setColor(Color.blue);		
		g.drawOval(d.width/2-3-vo,d.height/2-3,6,6);		
		for (i=0;i<m;i=i+1){
		if (x[i]+r[i]+vo==100||x[i]-r[i]+vo==100||x[i]+r[i]+vo==101||x[i]-r[i]+vo==101){
		g.setColor(Color.blue);		
		g.fillOval(d.width/2-3-vo,d.height/2-3,6,6);
		}
		}
	}
	void move (){
		for (i=0;i<m;i++){
		r[i]=r[i]+p*s[i];}
		k=k+p;
		if (k==12){
		k=0;
		l=l+p;
		x[l]=vs*l;
		r[l]=0;
		s[l]=p;
		if (l==33){
		p=0;pp=1000;l=0;
		}
		}	
		j=j+1;
		if (j>=5)q=0;
		if (j==8){
		q=1000;j=0;
		}
		n=n+p;
		if(n==2){
		n=0;vo=vo+p*pvo;
		}
		
		
	}

	
	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)) {
                 p=0;l=0;k=0;pp=0;vo=0;
                 for (i=0;i<m;i++){
		r[i]=3;
		s[i]=0;
		x[i]=500;
		}
		x[0]=0;
		return true;
             } 
	     if ("v=0".equals(o)) {
		 p=1;l=0;k=0;vo=0;
		 vs=0;
                 for (i=0;i<m;i++){
		r[i]=0;
		s[i]=0;
		x[i]=500;
		}
                
                 return true;
             }
             if ("v<c".equals(o)) {
                 p=1;l=0;k=0;vo=0;
		 vs=5;
                 for (i=0;i<m;i++){
		r[i]=0;
		s[i]=0;
		x[i]=500;
		}
                 return true;
             }
            
             if ("v=c".equals(o)) {
		 p=1;l=0;k=0;vo=0;
		 vs=12;
                 for (i=0;i<m;i++){
		r[i]=0;
		s[i]=0;
		x[i]=500;
		}
                 
                 return true;
             }
	     if("v>c".equals(o)) {
		 p=1;l=0;k=0;vo=0;
		 vs=20;
                 for (i=0;i<m;i++){
		r[i]=0;
		s[i]=0;
		x[i]=500;
		}
		return true;
		}
       	     if("vo=0".equals(o)) {
		 pvo=0;
		
		return true;
		}
       	     if("vo<0".equals(o)) {
		pvo=1;
		return true;
		}
	     if("vo>0".equals(o)) {
		pvo=-1;
		return true;
		}
	    if ("Start".equals(o)) {
                 p=1;
                 
                 return true;
             }	
	    if ("Stop".equals(o)) {
                 p=0;pp=1000;
                
                 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;
		}
	}
}
