import java.awt.*;
import java.applet.*;
import java.lang.*;
public class Aggressive 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);
double r1 = 0.5;
double r2 = 0.5;
double ponp = -0.005;
double qonp = -0.01;
double ponq = -0.01;
double qonq = -0.005;
double highpop = 300.0;
double spacing = 50.0;
double mag, dp, dq, h, oldp, oldq, newp, newq;
int running = 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();
}
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 * r1 * (1.0 + ponp * p + qonp * q));
return z;
}
public double qprime(double p, double q)
{
double z;
z = (q * r2 * (1.0 + ponq * p + qonq * q));
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(buttonout);
bG.fillRect(50, 204, 101, 17);
bG.setColor(buttonin);
bG.fillRect(52, 206, 97, 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, 0, 0, 200);
if ((ponp < 0.0) && (qonp < 0.0))
{
bG.drawLine(0, qscale(-1.0/qonp), pscale(-1.0/ponp), 200);
}
bG.setColor(qcolor);
bG.drawLine(0, 200, 200, 200);
if ((ponq < 0.0) && (qonq < 0.0))
{
bG.drawLine(0, qscale(-1.0/qonq), pscale(-1.0/ponq), 200);
}
}
public boolean mouseDown(Event evt, int mx, int my)
{
if (running == 1)
{
return true;
}
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;
running = 1;
simulate();
}
if ((my > 202) && (mx > 49) && (mx < 151))
{
drawback();
sG.drawImage(bI, 0, 0, this);
}
return true;
}
public void simulate()
{
h = highpop/200.0;
for (int i = 0; i < 1000; i = i + 1)
{
dp = pprime(oldp, oldq);
dq = qprime(oldp, oldq);
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.drawLine(pscale(oldp), qscale(oldq), pscale(newp), qscale(newq));
cG.drawImage(bI, 0, 0, this);
cG.setColor(black);
cG.fillOval(pscale(newp) - 2, qscale(newq) - 2, 5, 5);
sG.drawImage(cI, 0, 0, this);
oldp = newp;
oldq = newq;
if (mag < 0.001 * h)
{
i = 1001;
}
}
running = 0;
}
}
Copyright c 1997 by
Frank Wattenberg, Department of Mathematics, Montana State University,
Bozeman, MT 59717