import java.awt.*;
import java.applet.*;
import java.lang.*;

public class Onevarnl extends Applet
{
      Graphics      bG;
      Graphics      sG;
      Image         bI;
      Graphics      cG;
      Image         cI;

      Color         back         = new Color(247, 243, 234);
      Color         pback        = new Color(192, 255, 192);
      Color         plines       = new Color(0, 255, 0);
      Color         tback        = new Color(192, 192, 255);
      Color         tlines       = new Color(0, 0, 255);
      Color         black        = new Color(0, 0, 0);
      Color         origin       = new Color(255, 0, 255);
      Color         pcolor       = new Color(255, 0, 0);

      double        pstart       = 0.5;
      double        h            = 0.02;
      int           ip;
      int           running      = 0;

      double[]      pts          = {0.5, 0.25, 0.0, -0.25, -0.50,
                                    -0.30, -0.10, 0.10, 0.30, 0.50, 0.30};

      double        a, b;
      int           ix;

      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 fscale(double y)
      {       
             int  k;
             k = (int) java.lang.Math.round(100 - 100 * y);
             return k;
      }

      public int leftpscale(double y)
      {
             int k;
             k = (int) java.lang.Math.round(100.0 + 100.0 * y);
             return k;
      }
            
      public int rightpscale(double y)
      {
             int k;
             k = (int) java.lang.Math.round(100.0 - 100.0 * y);
             return k;
      }

      public double foo(double p)
      {
             int       j;
             double    t;
             double    fout = 0.0;
             j = (int) java.lang.Math.floor((p + 1)/0.20);
             j = java.lang.Math.max(0, j);
             j = java.lang.Math.min(10, j);
             if (j < 10)
             {
                 t = (p + 1)/0.20 - j;
                 fout = pts[j] * (1 - t) + pts[j + 1] * t;
             }
             if (j == 10) fout = pts[10];
             return fout;
      }

      public void drawback()
      {
             bG.setColor(back);
             bG.fillRect(0, 0, 501, 251);
             bG.setColor(pback);
             bG.fillRect(0, 0, 201, 201);
             bG.setColor(tlines);
             bG.fillRect(250, 220, 251, 21);
             bG.setColor(tback);
             bG.fillRect(253, 223, 245, 15);
             bG.setColor(tback);
             bG.fillRect(250, 0, 251, 201);
             bG.setColor(pcolor);
             bG.drawLine(0, 100, 201, 100);
             bG.drawLine(0, 220, 201, 220);
             bG.drawLine(250, 0, 250, 200);
             for (int i = 0; i < 201; i = i + 20)
             {
                 bG.setColor(tlines);
                 bG.drawLine(250, i, 500, i);
                 bG.setColor(plines);
                 bG.drawLine(i, 0, i, 200);
             }
             for (int i = 0; i < 10; i= i + 1)
             {
                 bG.setColor(black);
                 bG.drawLine(20 * i, fscale(pts[i]), 
                             20 * i + 20, fscale(pts[i + 1]));
                 if ((pts[i] > 0) && (pts[i + 1] > 0))
                 {
                    bG.setColor(black);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 14, 238, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 14, 242, 20 * i + 16, 240);
                 }
                 if ((pts[i] < 0) && (pts[i + 1] < 0))
                 {
                    bG.setColor(black);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 6, 238);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 6, 242);
                 }
                 if ((pts[i] == 0) && (pts[i + 1] > 0))
                 {
                    bG.setColor(black);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 14, 238, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 14, 242, 20 * i + 16, 240);
                    bG.setColor(origin);
                    bG.fillOval(20 * i - 2, 238, 5, 5);
                    bG.fillOval(20 * i - 2, 98, 5, 5);
                    bG.fillOval(248, 198 - 20 * i, 5, 5);
                 }
                 if ((pts[i] == 0) && (pts[i + 1] < 0))
                 {
                    bG.setColor(black);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 6, 238);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 6, 242);
                    bG.setColor(origin);
                    bG.fillOval(20 * i - 2, 238, 5, 5);
                    bG.fillOval(20 * i - 2, 98, 5, 5);
                    bG.fillOval(248, 198 - 20 * i, 5, 5);
                 }
                 if ((pts[i] > 0) && (pts[i + 1] == 0))
                 {
                    bG.setColor(black);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 14, 238, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 14, 242, 20 * i + 16, 240);
                    bG.setColor(origin);
                    bG.fillOval(20 * i + 18, 238, 5, 5);
                    bG.fillOval(20 * i + 18, 98, 5, 5);
                    bG.fillOval(248, 178 - 20 * i, 5, 5);
                 }
                 if ((pts[i] < 0) && (pts[i + 1] == 0))
                 {
                    bG.setColor(black);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 16, 240);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 6, 238);
                    bG.drawLine(20 * i + 4, 240, 20 * i + 6, 242);
                    bG.setColor(origin);
                    bG.fillOval(20 * i + 18, 238, 5, 5);
                    bG.fillOval(20 * i + 18, 98, 5, 5);
                    bG.fillOval(248, 178 - 20 * i, 5, 5);
                 }
                 if ((pts[i] == 0) && (pts[i + 1] == 0))
                 {
                    bG.setColor(origin);
                    bG.fillOval(20 * i + 18, 238, 5, 5);
                    bG.fillOval(20 * i + 18, 98, 5, 5);
                    bG.fillOval(20 * i - 2, 238, 5, 5);
                    bG.fillOval(20 * i - 2, 98, 5, 5);
                    bG.fillOval(248, 198 - 20 * i, 5, 5);
                    bG.fillOval(248, 178 - 20 * i, 5, 5);
                    bG.drawLine(20 * i, 238, 20 * i + 20, 238);
                    bG.drawLine(20 * i, 239, 20 * i + 20, 239);
                    bG.drawLine(20 * i, 240, 20 * i + 20, 240);
                    bG.drawLine(20 * i, 241, 20 * i + 20, 241);
                    bG.drawLine(20 * i, 242, 20 * i + 20, 242);
                    bG.drawLine(20 * i, 98, 20 * i + 20, 98);
                    bG.drawLine(20 * i, 99, 20 * i + 20, 99);
                    bG.drawLine(20 * i, 100, 20 * i + 20, 100);
                    bG.drawLine(20 * i, 101, 20 * i + 20, 101);
                    bG.drawLine(20 * i, 102, 20 * i + 20, 102);
                    bG.drawLine(248, 200 - 20 * i, 248, 180 - 20 * i);
                    bG.drawLine(249, 200 - 20 * i, 249, 180 - 20 * i);
                    bG.drawLine(250, 200 - 20 * i, 250, 180 - 20 * i);
                    bG.drawLine(251, 200 - 20 * i, 251, 180 - 20 * i);
                    bG.drawLine(252, 200 - 20 * i, 252, 180 - 20 * i);
                 }
                 if ((pts[i] * pts[i + 1]) < 0)
                 {
                    a = java.lang.Math.abs(pts[i]);
                    b = java.lang.Math.abs(pts[i + 1]);
                    ix = (int) java.lang.Math.round(20.0 * a / (a + b));
                    bG.setColor(origin);
                    bG.fillOval(i * 20 + ix - 2, 238, 5, 5);
                    bG.fillOval(248, 198 - (i * 20 + ix), 5, 5);
                    bG.fillOval(i * 20 + ix - 2, 98, 5, 5);
                 }
             }
             bG.setColor(black);
             ip = leftpscale(pstart);
             bG.drawLine(ip, 216, ip, 208);
             bG.drawLine(ip, 216, ip + 2, 214);
             bG.drawLine(ip, 216, ip - 2, 214);
             ip = rightpscale(pstart);
             bG.drawLine(238, ip, 246, ip);
             bG.drawLine(244, ip + 2, 246, ip);
             bG.drawLine(244, ip - 2, 246, ip);
      }

      public boolean mouseDown(Event evt, int mx, int my)
      {
             if (running == 1)
             {
                return true;
             }
             if ((my > 210) && (mx < 201))
             {  
                pstart = (mx - 100)/100.0;
                drawback();
                sG.drawImage(bI, 0, 0, this);
             }
             if ((mx > 225) && (mx < 270) && (my < 201))
             {
                pstart = (100 - my)/100.0;
                drawback();
                sG.drawImage(bI, 0, 0, this);
             }
             if ((my > 219) && (my < 241) && (mx > 249))
             {
                simulate();
             }
             if (my < 201)
             {   for (int i = 0; i < 11; i = i + 1)
                 if ((mx > 20 * i - 3) && (mx < 20 * i + 3))
                 {
                     pts[i] = (100.0 - my)/100.0;
                     drawback();
                     sG.drawImage(bI, 0, 0, this);
                 }
             }
             return true;
       }

       public void simulate()
       {
             double op, np;
 
             op = pstart;
             np = pstart;
             running = 1;
             drawback();
             cG.drawImage(bI, 0, 0, this);
             cG.setColor(black);
             cG.fillOval(leftpscale(pstart) - 3, 217, 7, 7);
             sG.drawImage(cI, 0, 0, this);
             for(int i = 1; i < 251; i = i + 1)
             {
                 np = op + h * foo(op);
                 bG.setColor(black);
                 bG.drawLine(249 + i, rightpscale(op), 
                             250 + i, rightpscale(np));
                 cG.drawImage(bI, 0, 0, this);
                 cG.setColor(black);
                 cG.fillOval(248 + i, rightpscale(np) - 2, 5, 5);
                 cG.fillOval(leftpscale(np) - 3, 217, 7, 7);
                 sG.drawImage(cI, 0, 0, this);
                 op = np;
                 if (java.lang.Math.abs(np) > 1) i = 300;                 
             }
             running = 0;
      }

}




               


Copyright c 1997 by Frank Wattenberg, Department of Mathematics, Montana State University, Bozeman, MT 59717