import java.awt.*;
import java.applet.*;
import java.lang.*;

public class Tide extends Applet
{
      Graphics      sG;

      Graphics      bG;
      Image         bI;

      Graphics      cG;
      Image         cI;

      Color         back        = new Color(247, 243, 234);
      Color         lines       = new Color(128, 128, 128);
      Color         black       = new Color(0, 0, 0);
      Color         red         = new Color(255, 0, 0);
      Color         blue        = new Color(0, 0, 255);

      double        topx        = 4.0;
      double        topy        = 2.0;
      double        k           = 1.0;

      double        ddx         = topx/20.0;

      public void init()
      {
             bI = createImage(this.size().width, this.size().height);
             bG = bI.getGraphics();
             cI = createImage(this.size().width, this.size().height);
             cG = cI.getGraphics();
             drawback();
             cG.drawImage(bI, 0, 0, this);
      }

      public void paint(Graphics g)
      {
             g.drawImage(cI, 0, 0, this);
             sG = getGraphics();
      }

      public void update(Graphics g)
      {
             g.drawImage(cI, 0, 0, this);
      }

      public int xscale(double x)
      {
             int z;
             z = (int) java.lang.Math.round(10.0 + 200.0 * x/topx);
             return z;
      }

      public int yscale(double y)
      {
             int z;
             z = (int) java.lang.Math.round(110 - 100.0 * y/topy);
             return z; 
      }

      public double ambient(double t)
      {
             double z;
             z = java.lang.Math.sin(3.1418 * t);
             return z;
      }

      public double slope(double t, double y)
      {
             double z;
             z = k * (ambient(t) - y);
             return z;
      }

      public void drawback()
      {
             bG.setColor(lines);
             bG.fillRect(0, 0, 221, 221);
             bG.setColor(back);
             bG.fillRect(10, 10, 201, 201);
             bG.setColor(lines);
             for(double t = 0.0; t < 1.0001 * topx; t = t + 1.0)
             {
                 bG.drawLine(xscale(t), 10, xscale(t), 210);
             }
             for(int i = 10; i < 211; i = i + 20)
             {
                 bG.drawLine(10, i, 210, i);
             }
             bG.setColor(black);
             for(double t = 0.0; t < 0.995 * topx; t = t + topx/100.0)
             {
                bG.drawLine(xscale(t), yscale(ambient(t)), 
                            xscale(t + topx/100.0), yscale(ambient(t + topx/100.0)));
                bG.drawLine(xscale(t), yscale(ambient(t)) + 1, 
                            xscale(t + topx/100.0), yscale(ambient(t + topx/100.0)) + 1);
                bG.drawLine(xscale(t), yscale(ambient(t)) - 1, 
                            xscale(t + topx/100.0), yscale(ambient(t + topx/100.0)) - 1);
             }
      }

       public boolean mouseDown(Event evt, int mx, int my)
       {
             double x = (mx - 10) * topx / 200;
             double y = (110 - my) * topy / 100;
             double m = 0.0;
             double dx;

             if((my > 211) || (my < 10) || (mx > 211) || (mx < 10))
             {
                  cG.drawImage(bI, 0, 0, this);
                  sG.drawImage(cI, 0, 0, this);
                  return true;
             }

             if (my > yscale(ambient(x)) + 1)
             {
                  m = slope(x, y);
                  cG.setColor(red);
             }
             
             if (my < yscale(ambient(x)) - 1)
             {
                  m = slope(x, y);
                  cG.setColor(blue);
             }
             
             if ((yscale(ambient(x)) + 3 > my) &&
                 (yscale(ambient(x)) - 3 < my))
             {  
                  m = 0.0;
                  cG.setColor(black);
                  my = yscale(ambient(x));
                  y = ambient(x);
             }

             cG.fillOval(mx - 2, my - 2, 5, 5);
             dx = ddx / java.lang.Math.sqrt(1 + m * m);
             cG.drawLine(xscale(x - dx), yscale(y - m * dx),
                         xscale(x + dx), yscale(y + m * dx));
             sG.drawImage(cI, 0, 0, this);
             return true;
       }


}


Copyright c 1997 by Frank Wattenberg, Department of Mathematics, Montana State University, Bozeman, MT 59717