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