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.