Euler's Method in Pictures -- Applet Code



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

public class EulerGraph extends Applet
{
       Panel    function_panel = new Panel();
       Panel    x_panel        = new Panel();
       Panel    y_panel        = new Panel();

       private  TextField Function_Text = new TextField("0.05 * (65 - y)", 25);
       private  TextField x_min_Text    = new TextField("0", 8);
       private  TextField x_max_Text    = new TextField("30", 8);
       private  TextField y_min_Text    = new TextField("0", 8);
       private  TextField y_max_Text    = new TextField("200", 8);

       String   UserInput;

       Expr     function;

       Variable     x     = Variable.make("t"); 
       Variable     y     = Variable.make("y");
       Variable     Picon = Variable.make("Pi");
       Variable     PIcon = Variable.make("PI");
       Variable     picon = Variable.make("pi");
       Variable     Econ  = Variable.make("E");
       Variable     econ  = Variable.make("e");

       Graphics     sG;
       Graphics     bG;
       Image        bI;
       Graphics     cG;
       Image        cI;

       Color        black        = new Color(0, 0, 0);
       Color        white        = new Color(255, 255, 255);
       Color        back         = new Color(247, 243, 234);
       Color        grid         = new Color(128, 128, 255);
       Color        red          = new Color(255, 64, 64);
       Color        blue         = new Color(0, 0, 255);
       Color        gray         = new Color(128, 128, 128);

       double       xmin =   0.0;
       double       xmax =  30.0;
       double       ymin =   0.0;
       double       ymax = 100.0;

       double       px, py, qx, qy, oldx, oldy, fcn;

       int          top    = 120;
       int          width  = 400;
       int          left   =  10;
       int          wholewidth = 421;
       int          sw = 0;

       public void init()
       {
              bI = createImage(wholewidth, wholewidth);
              bG = bI.getGraphics();
              cI = createImage(wholewidth, wholewidth);
              cG = cI.getGraphics();
             
              drawback();

              picon.set_value(Math.PI);
              Picon.set_value(Math.PI);
              PIcon.set_value(Math.PI);
              econ.set_value(Math.E);   
              Econ.set_value(Math.E); 
              setBackground(back);
              setFont(new Font("Courier", Font.BOLD, 12));
              function_panel.setBackground(back);
              function_panel.setFont(new Font("Courier", Font.BOLD, 12));
              function_panel.add(new Label(" f(t, y): "));
              function_panel.add(Function_Text);
              add(function_panel);
              x_panel.setBackground(back);
              x_panel.setFont(new Font("Courier", Font.BOLD, 12));
              x_panel.add(new Label(" minimum t: "));
              x_panel.add(x_min_Text);
              x_panel.add(new Label(" maximum t: "));
              x_panel.add(x_max_Text);
              add(x_panel);
              y_panel.setBackground(back);
              y_panel.setFont(new Font("Courier", Font.BOLD, 12));
              y_panel.add(new Label(" minimum y: "));
              y_panel.add(y_min_Text);
              y_panel.add(new Label(" maximum y: "));
              y_panel.add(y_max_Text);
              add(y_panel);

       }

       public void paint(Graphics g)
       {
              g.drawImage(cI, 0, top, this);
              sG = getGraphics();
       }

       public void update(Graphics g)
       {
              g.drawImage(cI, 0, top, this);
       }
 
       public void drawback()
       {
              bG.setColor(gray);
              bG.fillRect(0, 0, wholewidth, wholewidth);
              bG.setColor(back);
              bG.fillRect(left, left, width + 1, width + 1);
              bG.setColor(grid);
              for (int i = 0; i < width + 1; i = i + width/10)
              {
                  bG.drawLine(left, left + i, left + width, left + i);
                  bG.drawLine(left + i, left, left + i, left + width);
              }
              cG.drawImage(bI, 0, 0, this);
       }

       public int xscale(double x)
       {
              int ix;
              ix = (int) Math.round(left + width * (x - xmin) / (xmax - xmin));
              return ix;
       }
 
       public int yscale(double y)
       {
              int iy;
              iy = (int) Math.round(left + width - width * (y - ymin)/(ymax - ymin));
              return iy;
       }

       public double tangent(double x)
       {
              double val;
              val = py + fcn * (x - px);
              return val;
       }

       public void drawDotandLine()
       {
              if (sw == 1)
              {
                 bG.setColor(red);
                 for (int dx = -1; dx < 2; dx = dx + 1)
                 {  
                     for (int dy = -1; dy < 2; dy = dy + 1)
                     {
                           bG.drawLine(xscale(oldx) + dx, yscale(oldy) + dy, 
                                       xscale(px) + dx, yscale(py) + dy);
                     }
                 }

                 bG.setColor(black);
                 bG.fillOval(xscale(oldx) - 2, yscale(oldy) - 2, 5, 5);

              }

              bG.setColor(black);
              bG.fillOval(xscale(px) - 2, yscale(py) - 2, 5, 5);

              cG.drawImage(bI, 0, 0, this);
              cG.setColor(gray);
              cG.drawLine(xscale(xmin), yscale(tangent(xmin)),
                          xscale(xmax), yscale(tangent(xmax)));


              oldx = px;
              oldy = py;
              sw = 1;
       }

       public boolean mouseDown(Event evt, int mx, int my)
       {
              UserInput = x_min_Text.getText().trim();
              xmin = Double.valueOf(UserInput).doubleValue();
              UserInput = x_max_Text.getText().trim();
              xmax = Double.valueOf(UserInput).doubleValue();
              UserInput = y_min_Text.getText().trim();
              ymin = Double.valueOf(UserInput).doubleValue();
              UserInput = y_max_Text.getText().trim();
              ymax = Double.valueOf(UserInput).doubleValue();

              if ((my < top + left) || (my > top + left + width) ||
                  (mx < left) || (mx > left + width))
                 {
                      drawback();
                      sw = 0;
                 }
              else
                 {
                      qx = xmin + (xmax - xmin) * (mx - left) / width;
                      qy = ymax - (ymax - ymin) * (my - left - top) / width;
                      if (sw == 1)
                      {
                           if (Math.abs(yscale(qy) - yscale(tangent(qx))) > 5) 
                           {
                               return true;
                           }
                           qy = tangent(qx);
                      }
                      px = qx;
                      py = qy;
     
                      try
                      {
                           function = Parser.parse(Function_Text.getText());
                      }
                      catch (Syntax_error e)
                      {
                            System.err.println ("Syntax error: " + e);
                      }
                      x.set_value(px);
                      y.set_value(py);
                      fcn = function.value();

                      drawDotandLine();
                 }
              sG.drawImage(cI, 0, top, this);
              return true;
       }

}


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