import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.applet.*; import java.awt.geom.*; import java.math.*; import java.util.Random; public class ControlCanvas extends ScaleCanvas implements MouseListener, MouseMotionListener { Manager M; PolyWedge P,P2; //P2 is the conjugate of P PinwheelControl PC; ControlPanel MODE,COLOR,TEXT,DEMO; IntegerSelector WEDGE1,WEDGE2; Lever NUMBER,RANDOM,SPEED; ListenSquare TILEFIT,POLYFIT,RESET; int mode; ListenSquare GO; public ControlCanvas(int m) { addMouseListener(this); addMouseMotionListener(this); PC=new PinwheelControl(0,147,5); setPanels(); mode=m; NUMBER=new Lever(5,93,1,7); RANDOM=new Lever(5,150,2,7); TILEFIT=new ListenSquare(10,338,74,20,null); TILEFIT.on=0; POLYFIT=new ListenSquare(10,368,74,20,null); POLYFIT.on=0; RESET=new ListenSquare(10,398,74,20,null); RESET.on=0; GO=new ListenSquare(20,218,54,20,null); GO.on=1; SPEED=new Lever(5,268,3,7); } public void setPanels() { Color[] C0={new Color(50,0,150),Color.white,Color.white,Color.white,Color.green}; Color[] C1={new Color(70,0,120),Color.white,Color.white,Color.white,Color.green}; Color[] C2={new Color(0,0,150),Color.white,Color.white,Color.white,Color.green}; Color[] C3={new Color(80,0,80),Color.white,Color.white,Color.white,Color.green}; String[] S1={"introduction","how to use", "main result","discussion","text"}; int[] state1={1,0,0,0}; TEXT=new ControlPanel(C3,S1,state1,4); String[] S2={"pinwheel","strip","outer","mode"}; int[] state2={1,0,0}; MODE=new ControlPanel(C0,S2,state2,3); MODE.mode=0; Color[] CC={Color.black,new Color(30,40,50),Color.white,new Color(80,90,100),new Color(150,0,0),Color.blue,Color.red,Color.black}; String[] S3={"background","polygon","poly outline","spokes","regions 1","regions 2","pointer","reset all","colors"}; int[] state3={1,1,1,1,1,1,1,1}; COLOR=new ControlPanel(C3,S3,state3,8,CC); String[] S4={"reset","outer billiards","strip map","theorem","theorem:gap","polygon","presets"}; int[] state4={0,0,0,0,0,0}; DEMO=new ControlPanel(C1,S4,state4,6); } public void recolor() { Color[] CC={Color.black,new Color(30,40,50),Color.white,new Color(80,90,100),new Color(150,0,0),Color.blue,Color.red,Color.black}; for(int i=0;i<8;++i) COLOR.L[i].C=new Color(CC[i].getRed(),CC[i].getGreen(),CC[i].getBlue(),CC[i].getAlpha()); } public void setSides(Point X) { NUMBER.process(X); RANDOM.process(X); SPEED.process(X); int test=0; if(NUMBER.isUsed(X)==1) test=1; if(RANDOM.isUsed(X)==1) test=1; if(test==1) { double t=1.0-RANDOM.val/6.0; if((t>.999)&&(NUMBER.val%2==0)) t=.95; P=PolyWedge.random(NUMBER.val+4,t); sendPolygon(P); } } public void sendPolygon(PolyWedge PP) { PolyWedge P=new PolyWedge(PP); P.slopes=Strips.sortSlopes(P); P.X=Strips.stripData(P,P.slopes[0]); PolyWedge P2=PolyWedge.conjugate(P); P2.slopes=Strips.sortSlopes(P2); P2.X=Strips.stripData(P2,P2.slopes[0]); M.P.P=new PolyWedge(P); M.P.P2=new PolyWedge(P2); M.C.PC.COUNT=NUMBER.val+4; M.C.PC.STRIP.max=NUMBER.val+4; M.C.PC.WEDGE1.max=NUMBER.val+4; M.C.PC.WEDGE2.max=NUMBER.val+4; try{M.P.doRun();} catch(Exception e) {} } public void paint(Graphics g2) { Graphics2D g=(Graphics2D) g2; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); if(mode==1) { PC.render(g); COLOR.render2(g,0,0,94); } if(mode==2) { MODE.render(g,0,432,94); TEXT.render2(g,0,619,94); DEMO.render2(g,0,503,94); drawSelectConsole(g); scaleRender(g); goRender(g,queryAnimation()); } } public void scaleRender(Graphics2D g) { g.setColor(new Color(0,0,200)); g.fillRect(0,295,94,130); g.setColor(Color.white); g.drawRect(0,295,94,130); g.setColor(Color.white); g.setFont(new Font("Helvetica",Font.PLAIN,18)); g.drawString("scaling",15,318); POLYFIT.render2(g,new Color(0,150,0)); TILEFIT.render2(g,new Color(0,150,0)); RESET.render2(g,Color.red); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.setColor(Color.white); g.drawString("tile fit",15,(int)(TILEFIT.y+15)); g.drawString("poly fit",15,(int)(POLYFIT.y+15)); g.drawString("reset",15,(int)(RESET.y+15)); } public void doAnimation() { if(queryAnimation()==true) { M.P.AN=new Animation(this.M); new Thread(M.P.AN).start(); } } public void goRender(Graphics2D g,boolean b) { g.setColor(new Color(10,30,255)); g.fillRect(0,178,94,110); g.setColor(Color.white); g.drawRect(0,178,94,110); g.setColor(Color.white); g.setFont(new Font("Helvetica",Font.PLAIN,18)); g.drawString("animation",8,198); SPEED.render(g,"speed",new Color(200,0,100)); if(b==false) GO.on=0; if(b==true) GO.on=1; GO.render2(g,new Color(200,0,100)); g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.setColor(Color.white); g.drawString("go",(int)(GO.x+10),(int)(GO.y+15)); } public boolean queryAnimation() { if(M.P.AN.halt==1) return(false); if(MODE.mode!=0) return(false); if(M.P.tile_count==0) return(false); return(true); } public void drawSelectConsole(Graphics2D g) { g.setColor(new Color(30,70,255)); g.fillRect(0,0,94,170); g.setColor(Color.white); g.drawRect(0,0,94,170); g.setColor(Color.white); g.setFont(new Font("Helvetica",Font.PLAIN,18)); g.drawString("polygon",10,23); g.drawString("selector",10,48); g.setFont(new Font("Helvetica",Font.PLAIN,12)); Integer D=new Integer(NUMBER.val+4); g.drawString("# sides "+D.toString(),20,88); g.drawString("randomness",12,145); NUMBER.render(g,"",new Color(100,0,100)); RANDOM.render(g,"",new Color(100,0,100)); } public void presets(Point X) { if(DEMO.L[0].inside(X)==1) programReset(); if(DEMO.L[1].inside(X)==1) setOuter(); if(DEMO.L[2].inside(X)==1) setStrip(); if(DEMO.L[3].inside(X)==1) setTheorem(3); if(DEMO.L[4].inside(X)==1) setTheorem2(); if(DEMO.L[5].inside(X)==1) setPolyDisplay(); } public void setOuter() { programReset(); MODE.setMode(2); M.C.PC.SHOW.setMode(0); } public void setStrip() { programReset(); MODE.setMode(1); for(int i=0;i<5;++i) { M.C.PC.SELECT[2][i].C=PinwheelControl.getColor(i,5); M.C.PC.SELECT[4][i].C=PinwheelControl.getColor(i,5); } M.C.PC.SELECT[1][0].on=1; M.C.PC.SELECT[3][0].on=1; M.P.setScales(350,350,75); } public boolean testGap() { int[] N=Animation.getN(M.P.STRIPS); int zoop=0; int S=N[0]; for(int i=0;iN.length) return(true); return(false); } public void setTheorem2() { boolean test=false; int count=0; while((count<100)&&(test==false)) { setTheorem(4); test=testGap(); ++count; } } public void setTheorem(int ran) { programReset(); MODE.setMode(0); for(int i=0;i<4;++i) M.C.PC.SHOW.L[i].on=0; M.C.PC.SHOW.L[0].on=1; NUMBER.val=3; RANDOM.val=ran; double t=1.0-RANDOM.val/6.0; P=PolyWedge.random(NUMBER.val+4,t); sendPolygon(P); double max=0; for(int i=0;i