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