Source Code for Reverse Engineering Applet



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

public class Gears extends Applet
{
       Graphics     bG;               // Graphics buffer
       Graphics     sG;               // Display
       Image        bI;

       Color        back              = new Color(0, 0, 0);
       Color        grafback          = new Color(192, 255, 192);
       Color        gridlines         = new Color(0, 255, 0);
       Color        controlback       = new Color(192, 192, 255);
       Color        datagraf          = new Color(255, 0, 0);
       Color        usergraf          = new Color(0, 0, 255);
       Color        black             = new Color(0, 0, 0);
       Color        white             = new Color(255, 255, 255);
       Color        bar               = new Color(255, 128, 128);

       int          gear1 = 200;
       int          gear2 = 110;
       int          gear3 =  65;

       int          break1 = 15;
       int          break2 = 30;

       int          usergear1 = 0;
       int          usergear2 = 0;
       int          usergear3 = 0;

       int          userbreak1 = 60;
       int          userbreak2 = 60;

       int          ix;

       Font         text = new Font("Helvetica", Font.BOLD, 12);

       public int yscale(int y)
       {  
              return 20 + (5000 - y)/35;
       }

       public int xscale(int x)
       {
              return 50 + 4 * x;
       }
       
       public void init()
       {      
              bI = createImage(this.size().width, this.size().height);
              bG = bI.getGraphics();
              bG.setFont(text);
              drawbackground();
       }

       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 void scale(int y)
       {
              bG.drawLine(333, y, 453, y);
              for(int x = 333; x < 454; x = x + 20)
              {
                  bG.drawLine(x, y - 4, x, y + 4);
              }
              for (int x = 333; x < 454; x = x + 4)
              {
                  bG.drawLine(x, y - 2, x, y + 2);
              }
              bG.drawString("0", 318, y + 4);
       }

       public void meter(int x, int y)
       {
              bG.setColor(controlback);
              bG.fillRect(333, y - 4, 121, 9);
              bG.setColor(bar);
              bG.fillRect(333, y - 4, x + 1, 9);
              bG.setColor(usergraf);
              scale(y);
              sG.drawImage(bI, 0, 0, this);
       }

       public void drawbackground()
       {
              bG.setColor(back);
              bG.fillRect(0, 0, 501, 231);
              bG.setColor(controlback);
              bG.fillRect(310, 10, 181, 181);
              bG.setColor(usergraf);
              bG.fillRect(10, 203, 291, 14);
              bG.setColor(controlback);
              bG.fillRect(12, 205, 287, 10);
              bG.setColor(usergraf);
              bG.drawString("Gear ratio 1", 362, 42);
              bG.drawString("Gear ratio 2", 362, 78);
              bG.drawString("Gear ratio 3", 362, 114);
              bG.drawString("Shiftpoint 1", 362, 150);
              bG.drawString("Shiftpoint 2", 362, 186);
              scale(20);
              bG.drawString("240", 460, 24);
              scale(56);
              bG.drawString("240", 460, 60); 
              scale(92);
              bG.drawString("240", 460, 96);
              scale(128);
              bG.drawString("60", 460, 132); 
              scale(164);
              bG.drawString("60", 460, 168); 
              bG.setColor(black);
              for (int y = 46; y < 180; y = y + 36)
              {
                  bG.drawLine(310, y, 491, y);
              }
              bG.setColor(gridlines);
              bG.fillRect(310, 203, 181, 14);
              bG.setColor(grafback);
              bG.fillRect(312, 205, 177, 10);
              newgraf();
       }

       public void newgraf()
       {
              bG.setColor(grafback);
              bG.fillRect(10, 10, 291, 181);
              bG.setColor(gridlines);
              for (int x = 0; x < 65; x = x + 5)
              {
                  bG.drawLine(xscale(x), yscale(0), xscale(x), yscale(5000));
              }
              for (int y = 0; y < 5500; y = y + 500)
              {
                  bG.drawLine(xscale(0), yscale(y), xscale(60), yscale(y));
              }
              bG.setColor(black);
              bG.drawString("Speed (miles/hour)", 110, 180);
              bG.drawString("RPM", 14, yscale(2300));
              bG.drawString("5000", 13, yscale(4800));
              bG.drawString("0", 35, yscale(-200));
              bG.drawString("0", xscale(-1), 180);
              bG.drawString("60", xscale(58), 180);
              bG.setColor(datagraf);
              bG.drawLine(xscale(0), yscale(0), 
                          xscale(break1), yscale(break1 * gear1));
              bG.drawLine(xscale(break1), yscale(break1 * gear2),
                          xscale(break2), yscale(break2 * gear2)); 
              bG.drawLine(xscale(break2), yscale(break2 * gear3),
                          xscale(60), yscale(60 * gear3)); 
              bG.drawLine(xscale(0), yscale(0) - 1, 
                          xscale(break1), yscale(break1 * gear1) - 1);
              bG.drawLine(xscale(break1), yscale(break1 * gear2) - 1,
                          xscale(break2), yscale(break2 * gear2) - 1); 
              bG.drawLine(xscale(break2), yscale(break2 * gear3) - 1,
                          xscale(60), yscale(60 * gear3) - 1); 
              bG.drawLine(xscale(0), yscale(0) + 1, 
                          xscale(break1), yscale(break1 * gear1) + 1);
              bG.drawLine(xscale(break1), yscale(break1 * gear2) + 1,
                          xscale(break2), yscale(break2 * gear2) + 1); 
              bG.drawLine(xscale(break2), yscale(break2 * gear3) + 1,
                          xscale(60), yscale(60 * gear3) + 1); 
       }

       public boolean mouseDown(Event evt, int x, int y)
       {
              if ((x > 332) && (y < 200))
              { 
                  ix = java.lang.Math.min(x - 333, 120);  
                  if (java.lang.Math.abs(y - 20) < 10)
                  {    
                      meter(ix, 20);
                      usergear1 = 2 * ix;
                  }
                  if (java.lang.Math.abs(y - 56) < 10)
                  {    
                      meter(ix, 56);
                      usergear2 = 2 * ix;
                  }
                  if (java.lang.Math.abs(y - 92) < 10)
                  {    
                      meter(ix, 92);
                      usergear3 = 2 * ix;
                  }
                  if (java.lang.Math.abs(y - 128) < 10)
                  {    
                      meter(ix, 128);
                      userbreak1 = ix/2;
                  }
                  if (java.lang.Math.abs(y - 164) < 10)
                  {    
                      meter(ix, 164);
                      userbreak2 = ix/2;
                  }
              }
              if ((x < 301) && (y < 200))
              { 
                  newgraf();  
                  bG.setColor(usergraf);
                  bG.drawLine(xscale(0), yscale(0), 
                              xscale(userbreak1), yscale(userbreak1 * usergear1));
                  bG.drawLine(xscale(userbreak1), yscale(userbreak1 * usergear2),
                              xscale(userbreak2), yscale(userbreak2 * usergear2)); 
                  bG.drawLine(xscale(userbreak2), yscale(userbreak2 * usergear3),
                              xscale(60), yscale(60 * usergear3)); 
                  bG.drawLine(xscale(0), yscale(0) - 1, 
                              xscale(userbreak1), yscale(userbreak1 * usergear1) - 1);
                  bG.drawLine(xscale(userbreak1), yscale(userbreak1 * usergear2) - 1,
                              xscale(userbreak2), yscale(userbreak2 * usergear2) - 1); 
                  bG.drawLine(xscale(userbreak2), yscale(userbreak2 * usergear3) - 1,
                              xscale(60), yscale(60 * usergear3) - 1); 
                  bG.drawLine(xscale(0), yscale(0) + 1, 
                              xscale(userbreak1), yscale(userbreak1 * usergear1) + 1);
                  bG.drawLine(xscale(userbreak1), yscale(userbreak1 * usergear2) + 1,
                              xscale(userbreak2), yscale(userbreak2 * usergear2) + 1); 
                  bG.drawLine(xscale(userbreak2), yscale(userbreak2 * usergear3) + 1,
                              xscale(60), yscale(60 * usergear3) + 1);
                  sG.drawImage(bI, 0, 0, this);
              }
              if (y > 200)
              {
                  if (x < 301)
                  {
                      break1 = (int) (10 + java.lang.Math.round(10 *
                                           java.lang.Math.random()));
                      break2 = (int) (10 + break1 +
                                           java.lang.Math.round(10 *
                                           java.lang.Math.random()));
                      gear1 = (int) (200 + 4 * java.lang.Math.round(5 *
                                           java.lang.Math.random()));
                      gear2 = (int) (110 + 4 * java.lang.Math.round(5 *
                                           java.lang.Math.random()));
                      gear3 = (int) ( 55 + 4 * java.lang.Math.round(5 *
                                           java.lang.Math.random()));
                      newgraf();
                      sG.drawImage(bI, 0, 0, this);
                  }
                  if (x > 310)
                  {
                      break1 = 15;
                      break2 = 30;
                      gear1  = 200;
                      gear2  = 110;
                      gear3  = 65;
                      newgraf();
                      sG.drawImage(bI, 0, 0, this);
                  }
              }
              return true;
       }

}             


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