Fourier Polynomial Applet



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

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

      Color         back         = new Color(247, 243, 234);
      Color         lines        = new Color(128, 128, 255);
      Color         black        = new Color(0, 0, 0);
      Color         red          = new Color(255, 0, 0);
      Color         pale         = new Color(255, 128, 128);
      Color         button       = new Color(255, 128, 128);
      Color         paleblue     = new Color(128, 128, 255);

      double[]      a = {-0.8, -0.6, -0.4, -0.2,  0.0,  0.2,  0.4,  0.6,  0.8,  1.0,
                          1.2,  1.2,  1.2,  1.2,  1.2,  1.2,  1.2, -0.8, -0.8, -0.8};

      double[]      b = {-0.6, -0.4, -0.2,  0.0,  0.2,  0.4,  0.6,  0.8,  1.0,  1.2,
                          1.2,  1.2,  1.2,  1.2,  1.2,  1.2,  1.2, -0.8, -0.8, -0.8};

      int           n = 0;

      double        sum;

      double[]    u = new double[1000];
      double[]    v = new double[1000];

      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(cI, 0, 0, this);
             sG = getGraphics();
      }

      public void update(Graphics g)
      {
             g.drawImage(cI, 0, 0, this);
      }

      public int yscale(double y)
      {
             int iy;
             iy = (int) java.lang.Math.round(110.0 - y * 60.0);
             return iy;
      }

      public void drawback()
      {
              int iy;

              bG.setColor(back);
              bG.fillRect(0, 0, 421, 241);

              bG.setColor(paleblue);
              bG.fillRect(10, 220, 401, 11);
              bG.setColor(button);
              bG.fillRect(110, 220, 201, 11);

              bG.setColor(lines);
              for (int i = 10; i < 421; i = i + 20)
              {
                  bG.drawLine(i, 10, i, 210);
              }
              for (int i = 10; i < 221; i = i + 20)
              {
                  bG.drawLine(10, i, 410, i);
              }
              bG.drawLine(209, 10, 209, 210);
              bG.drawLine(211, 10, 211, 210);
              bG.drawLine(10, 109, 410, 109);
              bG.drawLine(10, 111, 410, 111);

              bG.setColor(black);
              for (int i = 0; i < 20; i = i + 1)
              {   for (int dx = -1; dx < 2; dx = dx + 1)
                  {
                      for (int dy = -2; dy < 3; dy = dy + 1)
                       {
                            bG.drawLine(i * 20 + 10 + dx, yscale(a[i]) + dy,
                                        i * 20 + 30 + dx, yscale(b[i]) + dy);
 
                       }
                   }
               }

               sum = 0.0;
               for (int i = 0; i < 20; i = i + 1)
               {
                   sum = sum + a[i] + b[i];
               }
               sum = sum/40.0;
               iy = yscale(sum);
               bG.setColor(pale);
               bG.drawLine(10, iy, 410, iy);

               cG.drawImage(bI, 0, 0, this);

               cG.setColor(red);
               cG.fillRect(10, iy - 1, 401, 3);             
      }

      public boolean mouseDown(Event evt, int mx, int my)
      {
             int j;
             
             double      ox, oy, nx, ny;

             double      omega, m, bb, x0, x1;

             for (int i = 10; i < 421; i = i + 20)
             {
                  if ((my > 9) && (my < 211) && (mx >= i - 2) && (mx < i + 6))
                  {
                      n = 0;
                      j = (int) java.lang.Math.floor(mx/20.0);
                      if (j == 20)
                      {
                          j = 0;
                      }
                      a[j] = (110.0 - my)/60.0; 
                      drawback();
                      sG.drawImage(cI, 0, 0, this);
                  }                       
                  if ((my > 9) && (my < 211) && (mx <= i + 2) && (mx > i - 6))
                  {
                      n = 0;
                      j = (int) java.lang.Math.floor(mx/20.0);
                      j = j - 1;
                      if (j == -1)
                      {
                          j = 19;
                      }
                      b[j] = (110.0 - my)/60.0; 
                      drawback();
                      sG.drawImage(cI, 0, 0, this);
                  }                       
             }

             if(my > 215)
             {
                 if ((mx < 110)  || (mx > 310))
                 {
                     n = 0;
                     drawback();
                 }

                 cG.drawImage(bI, 0, 0, this);

                 omega = n + 1;
                 u[n] = 0.0;
                 v[n] = 0.0;

                 x1 = -3.1416;

                 for (int k = 0; k < 20; k = k + 1)
                 {
                      x0 = x1;
                      x1 = x1 + 3.1416/10.0;
                      m = (b[k] - a[k])/(3.1416/10.0);
                      bb = a[k] - m * x0;
                      u[n] = u[n] -
                              (m * java.lang.Math.cos(omega * x0) + 
                               bb * omega * java.lang.Math.sin(omega * x0) +
                               m * omega * x0 * java.lang.Math.sin(omega * x0))/(omega * omega) +
                              (m * java.lang.Math.cos(omega * x1) +
                               bb * omega * java.lang.Math.sin(omega * x1) +
                               m * omega * x1 * java.lang.Math.sin(omega * x1))/(omega * omega);
                      v[n] = v[n] +
                             (bb * omega * java.lang.Math.cos(omega * x0) +
                              m * omega * x0 * java.lang.Math.cos(omega * x0) -
                              m * java.lang.Math.sin(omega * x0))/(omega * omega) -
                             (bb * omega * java.lang.Math.cos(omega * x1) +
                              m * omega * x1 * java.lang.Math.cos(omega * x1) -
                              m * java.lang.Math.sin(omega * x1))/(omega * omega);
                  }

                  u[n] = u[n] / 3.1416;
                  v[n] = v[n] / 3.1416;

                  n = n + 1;
                  nx = -3.1416;
                  ny = sum;
                  for (int jj = 0; jj < n; jj = jj + 1)
                  {
                      ny = ny + u[jj] * java.lang.Math.cos((jj + 1) * nx) +
                                v[jj] * java.lang.Math.sin((jj + 1) * nx);          
                  }

                  for (int k = 10; k < 407; k = k + 5)
                  {
                       ox = nx;
                       nx = ox + 3.1416/40.00;
                       oy = ny;
                       ny = sum;
                       for (int jj = 0; jj < n; jj = jj + 1)
                       {
                           ny = ny + u[jj] * java.lang.Math.cos((jj + 1) * nx) +
                                     v[jj] * java.lang.Math.sin((jj + 1) * nx);          
                       }
                       bG.setColor(pale);
                       bG.drawLine(k, yscale(oy), k + 5, yscale(ny));
                       cG.setColor(red);

                       for (int dx = -1; dx < 2; dx = dx + 1)
                       {
                           for (int dy = -1; dy < 2; dy = dy + 1)
                           {
                               cG.drawLine(k + dx, yscale(oy) + dy,
                                           k + 5 + dx, yscale(ny) + dy);
                           }
                       } 
                  }
             sG.drawImage(cI, 0, 0, this);

             }

             return true;
      }

}





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