PFont font0,font1; float x0=60.86,x1=63.2,x2=90.8,x3=100, x5=98,x6=98,x7=72.5,x8=64, y0=19.76,y1=10,y2=11.5,y3=12, y5=31,y6=22,y7=14.5,y8=12, r0=127.4,r1=63.48,r2=8.5, r3=15.6,r4=74.8,r5=5; float ph=0,th=0; int i=0; int n0=-1,n1=-1,d0=0,d1=0; boolean plus0=false,plus1=false,minus0=false,minus1=false,dcarry0=false, dcarry1=false; void gear0(){ bezier(x0,y0,x1,y1,x1,y1,x2,y2); bezier(x2,y2,x3,y3,x3,-y3,x2,-y2); bezier(x2,-y2,x1,-y1,x1,-y1,x0,-y0); } void gear1(){ bezier(x5,y5,x6,y6,x6,y6,x7,y7); bezier(x7,y7,x8,y8,x8,-y8,x7,-y7); bezier(x7,-y7,x6,-y6,x6,-y6,x5,-y5); } void setup(){ size(720,360); background(255); smooth(); font0=loadFont("Courier-24.vlw"); font1=loadFont("Courier-48.vlw"); strokeWeight(2); frameRate(30); } void dial(){ ellipse(0,0,2*r0,2*r0); ellipse(0,0,2*r3,2*r3); fill(0); textFont(font1); for(int i=0;i<10;i++){ text(str(i),-14,-94); rotate(radians(-36)); } noFill(); for(int i=0;i<10;i++){ gear0(); rotate(radians(36)); } for(int i=0;i<10;i++){ ellipse(r1,0,2*r2,2*r2); rotate(radians(36)); } stroke(0,255,0); rotate(radians(198)); rect(r0-20,-4,20,8); rotate(radians(-198)); stroke(0); } void top(){ rect(-12,-125,24,32); arc(0,0,2*(r1+r2),2*(r1+r2),PI/2+0.16,TWO_PI+PI/2-0.16); arc(0,0,2*(r1-r2),2*(r1-r2),PI/2+0.16,TWO_PI+PI/2-0.16); line((r1-r2)*cos(PI/2-0.16),(r1-r2)*sin(PI/2-0.16), (r1+r2)*cos(PI/2-0.16),(r1+r2)*sin(PI/2-0.16)); line((r1-r2)*cos(PI/2+0.16),(r1-r2)*sin(PI/2+0.16), (r1+r2)*cos(PI/2+0.16),(r1+r2)*sin(PI/2+0.16)); rect(-130,100,30,30); rect(100,100,30,30); fill(255,0,0); textFont(font1); text("-",-129,127); text("+",101,130); for(int i=0;i<10;i++){ textFont(font1); text(str(i),100*cos(radians(72-i*36))-14,100*sin(radians(72-i*36))+15); textFont(font0); text(str(i),47*cos(radians(108+i*36))-6,47*sin(radians(108+i*36))+8); } noFill(); } void trans(){ ellipse(0,0,2*r3,2*r3); for(int i=0;i<10;i++){ gear1(); rotate(radians(36)); } rotate(radians(18)); stroke(0,255,0); for(int i=0;i<10;i++){ ellipse(r4,0,2*r5,2*r5); rotate(radians(36)); } stroke(0); rotate(radians(-18)); } void draw(){ fill(255); rect(0,0,width,height); stroke(0); noFill(); pushMatrix(); translate(2*89.3,180); rotate(radians(th)); dial(); rotate(radians(- th)); if(n1>=0){ fill(0,0,255); ellipse(r1*cos(radians(72-(n1+d1)*36+th)), r1*sin(radians(72-(n1+d1)*36+th)),2*r2,2*r2); noFill(); } popMatrix(); pushMatrix(); translate(2*171.5,180); rotate(radians(- th)); trans(); popMatrix(); pushMatrix(); translate(2*270.7,180); rotate(radians(ph)); dial(); rotate(radians(- ph)); if(n0>=0){ fill(0,0,255); ellipse(r1*cos(radians(72-(n0+d0)*36+ph)), r1*sin(radians(72-(n0+d0)*36+ph)),2*r2,2*r2); noFill(); } popMatrix(); stroke(255,0,0); pushMatrix(); translate(2*89.3,180); top(); popMatrix(); pushMatrix(); translate(2*270,180); top(); popMatrix(); stroke(0); if(n0==-1 && n1==-1){noLoop();} if(plus0 && n0>=0){ if(i<12*n0){i=i+1; if(324<=ph%360){th=th+3;dcarry0=true;} ph=ph+3; } else{if(dcarry0){d1=(d1+1)%10;dcarry0=false;} plus0=false;d0=(d0+n0)%10;n0=-1;} } if(minus0 && n0>=0){ if(i<12*(9-n0)){i=i+1; ph=ph-3; if(324<=ph%360){th=th-3;dcarry1=true;} } else{if(dcarry1){d1=(d1+9)%10;dcarry1=false;} minus0=false;d0=(d0+1+n0)%10;n0=-1;} } if(plus1 && n1>=0){ if(i<12*n1){i=i+1; th=th+3; } else{plus1=false;d1=(d1+n1)%10;n1=-1;} } if(minus1 && n1>=0){ if(i<12*(9-n1)){i=i+1; th=th-3; } else{minus1=false;d1=(d1+1+n1)%10;n1=-1;} } } void mousePressed(){ if(180+100<=mouseY && mouseY<180+130){ if(541.4-130<=mouseX && mouseX<541.4-100 && n0>=0){minus0=true;i=0;} if(541.4+100<=mouseX && mouseX<541.4+130 && n0>=0){plus0=true;i=0;} if(178.6-130<=mouseX && mouseX<178.6-100 && n1>=0){minus1=true;i=0;} if(178.6+100<=mouseX && mouseX<178.6+130 && n1>=0){plus1=true;i=0;} } for(int i=0;i<10;i++){ float a=radians(72-i*36); float x=r1*cos(a)+541.4,y=r1*sin(a)+180; if(x-r2<=mouseX && mouseX