/* Testing graphs  -  Knut Ekker,  knut@neti.no  January 1996 */
import java.awt.*;

public class graph extends java.applet.Applet implements Runnable {
  int wx, wy, yoff,xpts[],ypts[],nx,amplitude,origoSin,origoCos, freq;
  double x0,xmin,xmax,dx,ymin,ymax,dy,xscale,yscale,tmin,t,dt;
  double width, vwidth, vx;
  Thread kicker = null;
  Button Restart = new Button("Restart");
  Button Pause = new Button("Pause");
  Button Stop  = new Button("Stop");
  Choice C     = new Choice();
  Choice C2    = new Choice();

public void init() {
  wx = size().width;
  wy = size().height;
  resize(wx,wy);
  setBackground(Color.white);
  yoff = 50;
  nx = 2*yoff + wx / 2;
  xpts = new int[nx];
  ypts = new int[nx];
  origoSin = yoff + 50;
  origoCos = yoff + 150;
  amplitude = 30;
  freq = 3;
  wy -= yoff;
  InitSimulation();
  Panel p = new Panel();
  p.setLayout(new FlowLayout());
  p.add(Pause);
  p.add(Restart);
  p.add(Stop);
  C.addItem("Amplitude 1");
  C.addItem("Amplitude 2");
  C.addItem("Amplitude 3");
  C.addItem("Amplitude 4");
  C.addItem("Amplitude 5");
  C.select ("Amplitude 3");
  C2.addItem("Frequency 1");
  C2.addItem("Frequency 2");
  C2.addItem("Frequency 3");
  C2.addItem("Frequency 4");
  C2.addItem("Frequency 5");
  C2.select ("Frequency 3");
  p.add(C);
  p.add(C2);
  add("North",p);
  Restart.disable();
  C.disable();
  C2.disable();
}

public void InitSimulation() {
  x0 = 1;
  xmin = 0;
  xmax = 360;
  dx = (xmax-xmin)/(nx-1);
  xscale = (wx-0.5)/(xmax-xmin);
  for(int x=0;x<nx;x++){
    xpts[x] = x + yoff;
   }
}

public void paint(Graphics g)  {
  MakeGraph(g);
}

public void MakeGraph(Graphics g) {
  int ix, iy;
  int jx, jy;

  //g.setColor(Color.black);
  //g.drawRect(0,yoff,wx-1,wy-1);

  g.setColor(Color.red);
  ix = 1+yoff;
  jx = 375+yoff;
  iy = 1+yoff;
  jy = 150+yoff;
  g.drawRect(ix,iy,jx,jy);

  g.setColor(Color.blue);
  
  for(int x=0;x<nx;x++)
    ypts[x] = origoSin - (int)(Math.sin(x/freq)*amplitude );
  for (int x = 0 ; x < nx-1 ; x++ )
    g.drawLine(xpts[x], ypts[x], xpts [x+1], ypts[x+1]);

  g.setColor(Color.green);

  for(int x=0;x<nx;x++)
    ypts[x] = origoCos - (int)( Math.cos(x/freq)*amplitude );
  for (int x = 0; x < nx-1 ; x++ )
    g.drawLine(xpts[x], ypts[x], xpts[x+1], ypts[x+1]);
}

public void run () {
  while ( kicker != null ){
    /* step(); step(); step(); */
    t += dt;
    repaint();
    try {
      Thread.sleep(60);
    } catch (InterruptedException e) {
      break;
    }
  }
}
/*  Start the applet by forking an animation thread.  */

public void start() {
  if (kicker == null) {
    kicker = new Thread(this);
    kicker.start();
  }
}

/* Stop the applet. The thread will exit because kicker is set to null. */

public void stop() {
  if (kicker != null) {
    kicker.stop();
    kicker = null;
  }
}


public boolean mouseDown(java.awt.Event evt, int x, int y) {
 /* 
  requestFocus();
  if (null != kicker ) stop();
  else start();
  */
  return true;
}

public boolean action(Event evt, Object arg) {
  if (evt.target instanceof Choice) {
   if("Amplitude 1".equals(arg)) {
      amplitude = 10;
    } else if("Amplitude 2".equals(arg)) {
        amplitude = 20;
    } else if("Amplitude 3".equals(arg)) {
        amplitude = 30;
    } else if("Amplitude 4".equals(arg)) {
        amplitude = 40;
    } else if("Amplitude 5".equals(arg)) {
        amplitude = 50;
    } else if("Frequency 1".equals(arg)) {
        freq = 5;
    } else if("Frequency 2".equals(arg)) {
        freq = 4;
    } else if("Frequency 3".equals(arg)) {
        freq = 3;
    } else if("Frequency 4".equals(arg)) {
        freq = 2;
    } else if("Frequency 5".equals(arg)) {
        freq = 1;
    }

   } else {
     if ("Stop".equals(arg)) {
        stop();
        Stop.disable();
        Restart.enable();
        C.enable();
        C2.enable();
        Pause.disable();
      } else if ("Restart".equals(arg)) {
        Stop.enable();
        Restart.disable();
        C.disable();
        C2.disable();
        Pause.enable();
        Pause.setLabel("Pause");
        InitSimulation();
        start();
      } else if ("Pause".equals(arg)) {
        stop();
        Pause.setLabel("Resume");
      } else if ("Resume".equals(arg)) {
        start();
        Pause.setLabel("Pause");
      }
   }
   return true;
}
}
