import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math.*;
/*
<applet CODE="standing3.class" WIDTH=502 HEIGHT=402>
</applet>
*/
public class standing3 extends Applet implements Runnable {
    Thread th=null;
    float y1[] = new float[50];
    float y[] = new float[50];
    double t = 0;
    double scale=0.175;
    //一応波長が6cm。周波数が1秒のつもり。72dpiでscaleは計算。(あってない)
    //500Mhzの計算機だと50点が限界か?
    //  Graphics g;
    Image buffer;
    Graphics bufferg;
    static int DOUBLENUM = 2;                  //GUIの変数の数をいれる。
    Gui_double []gui= new Gui_double[DOUBLENUM];

    public void init(){
        Button bt;
       	//g=getGraphics();
	Dimension d = getSize();
	buffer = createImage(d.width, d.height-60);
        //ここにラベルと初期値をいれる。使う数だけ初期化する。
	gui[0]=new Gui_double("lambda 1<lambda<10cm","6",5);
	gui[1]=new Gui_double("freq. 1<nu<10Hz","1",5);
        //
        add(bt=new Button("Draw"));
        bt.addActionListener(new ActionListener(){
           public void actionPerformed(ActionEvent e){
               int i;
               for (i=0; i < DOUBLENUM ;i++){
                  gui[i].dval=new Double(gui[i].tf.getText()).doubleValue();
               }
               repaint();
           }
        });
    }
    public void update(Graphics g) {
      paint(g);
    }
    public void start(){
        if (th==null){
            th=new Thread(this);
            th.start();
        }
    }
    
    public void run(){
        int i;double PI=3.1416;
        while(true){
           for(i=0;i<50;i++){
	       //data を作成 式は簡単なはず。                    
             y[i]=30.f*(float)Math.sin(2*PI*((double)i*scale/gui[0].dval-gui[1].dval*t*0.01));
             y1[i]=30.f*(float)Math.sin(2*PI*((double)i*scale/gui[0].dval+gui[1].dval*t*0.01));
            }
            t=t+1.;
            repaint();

            try {
                th.sleep(100);
            }
            catch (InterruptedException e){}
        }
    }
    class Gui_double{
        Label la;
        TextField tf;
        double dval;
        public Gui_double(String st1,String st2,int d_field){
            add(la=new Label(st1));
            add(tf=new TextField(st2,d_field));
        }
    }
    public void paint(Graphics g){
	// バッファのグラフィックコンテキストを取得する
    if (bufferg == null)
      bufferg = buffer.getGraphics();    
        int i,ix,iy,ix0,iy0;
	Dimension d = getSize(); 
	bufferg.setColor(Color.white);
    	bufferg.fillRect(0, 0, d.width, d.height-60);
	bufferg.setColor(Color.black);
        //g.drawRect(0,60,500,400);
            for(i=1;i<50;i++){
                ix0=(i-1)*10;iy0=50-(int)y[i-1];
                ix=i*10;iy=50-(int)y[i];
                bufferg.drawLine(ix0,iy0,ix,iy);
            }
            for(i=1;i<50;i++){
                ix0=(i-1)*10;iy0=150-(int)y1[i-1];
                ix=i*10;iy=150-(int)y1[i];
                bufferg.drawLine(ix0,iy0,ix,iy);
            }
            for(i=1;i<50;i++){
                ix0=(i-1)*10;iy0=250-(int)(y[i-1]+y1[i-1]);
                ix=i*10;iy=250-(int)(y[i]+y1[i]);
                bufferg.drawLine(ix0,iy0,ix,iy);
            } 

              g.drawImage(buffer,0,60,this);
    }
}

