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