import java.applet.Applet; import java.awt.event.*; import java.awt.*; public class test1 extends Applet { MotionCanvas X; Animator A; ControlCanvas C; public void init() { setBackground(Color.blue); A=new Animator(); X=new MotionCanvas(); C=new ControlCanvas(); A=A.addMotionCanvas(X); X=X.addAnimator(A); C=C.addAnimator(A); C=C.addMotionCanvas(X); X.setSize(225,225); C.setSize(100,225); X.setBackground(Color.black); C.setBackground(new Color(20,50,120)); add(C); add(X); try { A.start(); } catch(Exception e) { System.out.println(e.toString()); } } } class MotionCanvas extends DBCanvas implements MouseListener, MouseMotionListener { Animator A; double mesh; Gear W[]=new Gear[5]; double speed; MotionCanvas() { speed=1.0; setBackground(Color.black); addMouseListener(this); addMouseMotionListener(this); mesh=0.0; Color C[][]=new Color[5][5]; double x[]=new double[5]; double y[]=new double[5]; double r[][]=new double[5][15]; r[1][1]=75.0; //radius r[1][2]=30.0; //gear number r[1][3]=.0025; //speed r[1][4]=.8; //gear size r[1][5]=0.01; //phase r[1][6]=9.0; //eye size; r[1][7]=66.0; //xpos r[1][8]=66.0; //ypos C[1][1]=Color.yellow; //circle color C[1][2]=Color.blue; //teeth color C[1][3]=Color.red; //eye color W[1]=new Gear(r[1],C[1],this); r[2][1]=50.0; r[2][2]=20.0; r[2][3]=-.00375; r[2][4]=.7; r[2][5]=0.0; r[2][6]=5.0; r[2][7]=91.0; r[2][8]=179.0; C[2][1]=Color.blue; C[2][2]=Color.green; C[2][3]=Color.white; W[2]=new Gear(r[2],C[2],this); r[3][1]=50.0; r[3][2]=20.0; r[3][3]=-0.00375; r[3][4]=.7; r[3][5]=0.0; r[3][6]=5.0; r[3][7]=179.0; r[3][8]=91.0; C[3][1]=Color.red; C[3][2]=Color.yellow; C[3][3]=Color.orange; W[3]=new Gear(r[3],C[3],this); r[4][1]=37.0; r[4][2]=15.0; r[4][3]=0.005; r[4][4]=.6; r[4][5]=0.03; r[4][6]=4.0; r[4][7]=170.0; r[4][8]=170.0; C[4][1]=Color.orange; C[4][2]=Color.red; C[4][3]=Color.cyan; W[4]=new Gear(r[4],C[4],this); } MotionCanvas addAnimator(Animator A) { MotionCanvas Y=this; Y.A=A; return(Y); } public void paint(Graphics g) { for(int i=1;i<=4;++i) W[i].render(g); } public void mouseDragged (MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} public void mouseExited(MouseEvent e) { for(int i=1;i<=4;++i) { W[i].eye.x=125; W[i].eye.y=125; } } public void mouseMoved(MouseEvent e) { e.consume(); for(int i=1;i<=4;++i) { W[i].eye.x=e.getX(); W[i].eye.y=e.getY(); } } } class Gear { double r[]; Color C[]; MotionCanvas X; Point eye; double mod; Gear(double r[],Color C[],MotionCanvas X) { this.r=r; this.C=C; this.X=X; eye=new Point(); eye.x=125; eye.y=125; mod=0.0; } void render(Graphics g) { double x,y,c1,s1,c2,s2,c3,s3,ii,mo,ex,ey,er; int x1,x2,y1,y2,x3,y3; x=r[7]; y=r[8]; /*****the teeth*****/ g.setColor(C[2]); for(int i=1;i<=r[2];++i) { ii=i; mo=mod+r[5]; c1=Math.cos(2*Math.PI*(mo+ii/r[2])); c2=Math.cos(2*Math.PI*(mo+ii/r[2]+.5/r[2])); c3=Math.cos(2*Math.PI*(mo+ii/r[2]-.5/r[2])); s1=Math.sin(2*Math.PI*(mo+ii/r[2])); s2=Math.sin(2*Math.PI*(mo+ii/r[2]+.5/r[2])); s3=Math.sin(2*Math.PI*(mo+ii/r[2]-.5/r[2])); x1=(int)(x+r[1]*c1); y1=(int)(y+r[1]*s1); x2=(int)(x+r[4]*r[1]*c2); y2=(int)(y+r[4]*r[1]*s2); x3=(int)(x+r[4]*r[1]*c3); y3=(int)(y+r[4]*r[1]*s3); int[] X={x1,x2,x3}; int[] Y={y1,y2,y3}; g.fillPolygon(X,Y,3); g.drawLine(x1,y1,x2,y2); g.drawLine(x1,y1,x3,y3); } /*********************/ /****the circle*****/ g.setColor(C[1]); x1=(int)(x); y1=(int)(y); x2=(int)(r[4]*r[1]+1); g.fillOval(x1-x2,y1-x2,2*x2,2*x2); /*******************/ /***the eye****/ g.setColor(C[3]); ex=eye.x-x; ey=eye.y-y; er=Math.sqrt(ex*ex+ey*ey); if(er>r[4]*r[1]-r[6]) { ex=.8*ex/er; ey=.8*ey/er; x1=(int)(x+r[4]*r[1]*ex); y1=(int)(y+r[4]*r[1]*ey); } if(er<=r[4]*r[1]-r[6]) { x1=(int)(eye.x); y1=(int)(eye.y); } g.fillOval((int)(x1-r[6]),(int)(y1-r[6]),(int)(2*r[6]),(int)(2*r[6])); g.setColor(Color.black); g.drawOval((int)(x1-r[6]),(int)(y1-r[6]),(int)(2*r[6]),(int)(2*r[6])); /*************/ } Gear update() { Gear H=this; H.mod=this.mod+X.speed*r[3]; return(H); } } class ControlCanvas extends Canvas implements MouseListener, MouseMotionListener { Animator A; MotionCanvas X; double speed; ControlCanvas() { addMouseListener(this); addMouseMotionListener(this); speed=1.0; } ControlCanvas addMotionCanvas(MotionCanvas X) { ControlCanvas B=this; B.X=X; return(B); } ControlCanvas addAnimator(Animator A) { ControlCanvas B=this; B.A=A; return(B); } public void paint(Graphics g) { int x1,x2; x1=(int)(100*speed); g.setColor(Color.black); g.fillRect(0,0,20,150); g.setColor(Color.white); g.drawRect(0,0,20,150); g.setColor(Color.red); g.drawRect(2,x1-1,16,2); g.setColor(Color.yellow); g.setFont(new Font("Helvetica",Font.PLAIN,16)); g.drawString("Rich",25,15); g.drawString("Applet 21",25,35); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.drawString("move the cursor",5,200); g.drawString("over the gears",5,220); } public void mouseDragged (MouseEvent e) {} public void mouseMoved(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) { e.consume(); Point p=new Point(); p.x=e.getX(); p.y=e.getY(); if((p.x>0)&&(p.x<20)&&(p.y>0)&&(p.y<150)) { speed=p.y/100.0; X.speed=speed; repaint(0,0,20,150); } } } class Animator extends Thread { MotionCanvas X; public void run() { while(true) { X.repaint(); for(int i=1;i<=4;++i) X.W[i]=X.W[i].update(); try {sleep(30);} catch(Exception e) { System.out.println(e.toString()); } } } Animator addMotionCanvas(MotionCanvas X) { Animator B=this; B.X=X; return(B); } }