import java.awt.*;
import java.applet.*;
import java.lang.*;
public class Prey extends Applet
{
Graphics bG;
Graphics sG;
Image bI;
Graphics cG;
Image cI;
Color back = new Color(247, 243, 234);
Color buttonout = new Color(0, 0, 0);
Color buttonin = new Color(128, 128, 128);
Color gridline = new Color(0, 255, 0);
Color gridback = new Color(192, 255, 192);
Color pcolor = new Color(255, 0, 0);
Color qcolor = new Color(0, 0, 255);
Color black = new Color(0, 0, 0);
Color slow = new Color(0, 0, 255);
Color slowback = new Color(128, 128, 255);
Color medium = new Color(255, 0, 255);
Color mediumback = new Color(255, 128, 255);
Color fast = new Color(255, 0, 0);
Color fastback = new Color(255, 128, 128);
Color stop = new Color(255, 64, 0);
Color stopback = new Color(255, 128, 0);
double highpop = 600.0;
double spacing = 100.0;
double mag, dp, dq, h, oldp, oldq, newp, newq;
double startp, startq;
int running = 0;
int speedfactor = 1;
Color graphcolor = fast;
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();
}
public void paint(Graphics g)
{
g.drawImage(bI, 0, 0, this);
sG = getGraphics();
}
public void update(Graphics g)
{
g.drawImage(bI, 0, 0, this);
}
public int pscale(double p)
{
int ik;
ik = (int) (java.lang.Math.round(200.0 * p/highpop));
return ik;
}
public int qscale(double q)
{
int ik;
ik = (int) (java.lang.Math.round(200.0 - 200.0 * q/highpop));
return ik;
}
public double pprime(double p, double q)
{
double z;
z = p * (0.005 * q - 1.0);
return z;
}
public double qprime(double p, double q)
{
double z;
z = q * (1 - 0.005 * p);
return z;
}
public void drawback()
{
bG.setColor(back);
bG.fillRect(0, 201, 201, 20);
bG.setColor(gridback);
bG.fillRect(0, 0, 201, 201);
bG.setColor(slow);
bG.fillRect(5, 204, 30, 17);
bG.setColor(slowback);
bG.fillRect(7, 206, 26, 13);
bG.setColor(medium);
bG.fillRect(45, 204, 30, 17);
bG.setColor(mediumback);
bG.fillRect(47, 206, 26, 13);
bG.setColor(fast);
bG.fillRect(85, 204, 30, 17);
bG.setColor(fastback);
bG.fillRect(87, 206, 26, 13);
bG.setColor(stop);
bG.fillRect(125, 204, 30, 17);
bG.setColor(stopback);
bG.fillRect(127, 206, 26, 13);
bG.setColor(buttonout);
bG.fillRect(165, 204, 30, 17);
bG.setColor(buttonin);
bG.fillRect(167, 206, 26, 13);
for (double p = spacing; p < 1.001 * highpop; p = p + spacing)
{
bG.setColor(gridline);
bG.drawLine(0, qscale(p), 200, qscale(p));
bG.drawLine(pscale(p), 0, pscale(p), 200);
}
bG.setColor(pcolor);
bG.drawLine(0, 200, 0, 0);
bG.drawLine(0, qscale(200), 200, qscale(200));
bG.setColor(qcolor);
bG.drawLine(0, 200, 200, 200);
bG.drawLine(pscale(200), 0, pscale(200), 200);
}
public boolean mouseDown(Event evt, int mx, int my)
{
if ((my > 202) && (mx > 125) && (mx < 165))
{
simulate();
}
if (my < 201)
{
bG.setColor(black);
bG.fillOval(mx - 2, my - 2, 5, 5);
sG.drawImage(bI, 0, 0,this);
oldp = highpop * mx/200.0;
oldq = highpop * (200.0 - my)/200.0;
startp = oldp;
startq = oldq;
}
if ((my > 202) && (mx > 165) && (mx < 195))
{
drawback();
sG.drawImage(bI, 0, 0, this);
}
if ((my > 202) && (mx > 5) && (mx < 35))
{
speedfactor = 4;
graphcolor = slow;
oldp = startp;
oldq = startq;
simulate();
}
if ((my > 202) && (mx > 45) && (mx < 75))
{
speedfactor = 2;
graphcolor = medium;
oldp = startp;
oldq = startq;
simulate();
}
if ((my > 202) && (mx > 85) && (mx < 115))
{
speedfactor = 1;
graphcolor = fast;
oldp = startp;
oldq = startq;
simulate();
}
return true;
}
public void simulate()
{
int itop = 1000;
running = 1;
h = highpop/200.0;
h = h/speedfactor;
for (int i = 0; i < itop; i = i + 1)
{
for(int ii = 0; ii < speedfactor; ii = ii + 1)
{
dp = pprime(oldp, oldq)/speedfactor;
dq = qprime(oldp, oldq)/speedfactor;
mag = java.lang.Math.sqrt(dp*dp + dq*dq);
if (mag > h)
{
dp = dp * h / mag;
dq = dq * h / mag;
}
newp = oldp + dp;
newq = oldq + dq;
bG.setColor(graphcolor);
bG.drawLine(pscale(oldp), qscale(oldq), pscale(newp),
qscale(newq));
bG.setColor(black);
bG.fillOval(pscale(startp) - 2, qscale(startq) - 2, 5, 5);
cG.drawImage(bI, 0, 0, this);
cG.setColor(graphcolor);
cG.fillOval(pscale(newp) - 2, qscale(newq) - 2, 5, 5);
sG.drawImage(cI, 0, 0, this);
oldp = newp;
oldq = newq;
if (mag < 0.0001 * h)
{
i = itop + 1;
}
if (running == 0)
{
i = itop + 1;
}
}
}
running = 0;
}
}
Copyright c 1997 by
Frank Wattenberg, Department of Mathematics, Montana State University,
Bozeman, MT 59717