import java.applet.Applet; import java.awt.event.*; import java.awt.*; import java.awt.geom.*; class Hub extends ScaleCanvas implements MouseListener, MouseMotionListener { Manager M; ControlPanel SHORTCUT,POLY,TEXT; /**This class contains the central control hub. Most of the file is taken up to the routines which force the program into a certain pre-selected state.**/ Hub() { addMouseListener(this); addMouseMotionListener(this); makePanels(); } public void makePanels() { Color[] C0={new Color(0,80,80),Color.white,Color.white,Color.white,Color.yellow}; Color[] C1={new Color(40,0,80),Color.white,Color.white,Color.white,Color.yellow}; Color[] C2={new Color(80,0,80),Color.white,Color.white,Color.white,Color.yellow}; String[] S1={"reset program","ideal fractal","fractal parametrization","opposite circulation","same circulation","substitution demo","vertex check","survey vectors","special configurations"}; int[] state1={0,0,0,0,0,0,0,0}; SHORTCUT=new ControlPanel(C0,S1,state1,8); String[] S2={"outer billiards", "basic map","periodic orbits","renormalization","vectors","arith. graph","substitution","polygon exchange"}; int[] state2={1,0,0,0,0,0,0}; POLY=new ControlPanel(C1,S2,state2,7); String[] S3={"introduction","how to use","poly exchange","arithmetic graph","ideal limit", "substitution","final matchup","explanation"}; int[] state3={1,0,0,0,0,0,0}; TEXT=new ControlPanel(C2,S3,state3,7); } public void paint(Graphics gfx) { Graphics2D g=(Graphics2D) gfx; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); SHORTCUT.render2(g,0,0,199); POLY.render(g,100,133,99); TEXT.render(g,0,133,100); } public void shortcut(Point X) { int val=SHORTCUT.getValue(X); if(val>=0) { M.PL1.COUNT=0; M.PL2.COUNT=0; M.PL1.BGC=Color.black; M.PL2.BGC=Color.black; } if(val==0) resetProgram(); if(val==1) viewFractal(); if(val==2) viewFractalParam(); if(val==3) seeOppositeOrientations(); if(val==4) seeSameOrientations(); if(val==5) viewIdealSub(); if(val==6) vertexCheck(); if(val==7) surveyVectors(); } /**Here are the preset configurations**/ public void resetProgram() { M.C.SUBS.forceMode(1); M.C.REFINE.forceMode(0); M.C.GRAPH1.forceMode(-1); M.C.GRAPH2.forceMode(-1); M.C.INIT.val=1; M.C.resetFractalColors(); M.C.EDGE1.val=0; M.C.EDGE2.forceMode(0); M.C.EDGE3.val=0; M.C.FRACTAL1.forceMode(-1); M.C.FRACTAL2.forceMode(-1); M.C.VECTOR1.forceMode(-1); M.C.VECTOR2.forceMode(-1); M.PL1.COUNT=0; M.PL2.COUNT=0; M.C.SCALE.val=0; M.PD1.BGC=new Color(40,0,80); M.PD2.BGC=new Color(40,0,80); if(POLY.mode==0) M.PD1.ITER.val=1; if(POLY.mode==4) M.PD1.SITE.val=9; M.C.SAM.halt=0; M.PD2.COUNT=0; } public void seeOppositeOrientations() { resetProgram(); M.C.VECTOR1.L[4].on=1; M.C.VECTOR1.L[6].on=1; M.C.VECTOR2.L[4].on=1; M.C.VECTOR2.L[6].on=1; M.C.VECTOR1.M[4].C=new Color(255,0,150); M.C.VECTOR2.M[6].C=new Color(0,0,255); M.C.VECTOR2.M[4].C=new Color(255,0,150); M.C.VECTOR1.M[6].C=new Color(0,0,255); M.C.EDGE2.forceMode(1); } public void seeSameOrientations() { resetProgram(); M.C.VECTOR1.L[2].on=1; M.C.VECTOR1.L[6].on=1; M.C.VECTOR2.L[2].on=1; M.C.VECTOR2.L[6].on=1; M.C.VECTOR1.M[2].C=new Color(255,0,150); M.C.VECTOR2.M[6].C=new Color(0,0,255); M.C.VECTOR2.M[2].C=new Color(255,0,150); M.C.VECTOR1.M[6].C=new Color(0,0,255); M.C.EDGE2.forceMode(1); } public void vertexCheck() { resetProgram(); M.C.SUBS.forceMode(0); M.C.REFINE.forceMode(1); M.C.EDGE2.forceMode(2); M.C.VECTOR1.forceMode(4); M.C.VECTOR2.forceMode(4); for(int i=1;i<5;++i) { M.C.VECTOR2.M[2*i].C=new Color(0,255,255); M.C.VECTOR1.M[2*i].C=new Color(100,0,100,200); } M.C.FRACTAL1.forceMode(6); M.C.FRACTAL2.forceMode(6); M.C.FRACTAL2.M[6].C=new Color(0,0,255); M.C.FRACTAL1.M[6].C=new Color(255,0,0,30); M.C.SCALE.val=5; } public void surveyVectors() { resetProgram(); M.C.SUBS.forceMode(1); M.C.REFINE.forceMode(1); M.C.EDGE2.forceMode(2); M.C.VECTOR1.L[4].on=1; M.C.VECTOR2.L[4].on=1; M.C.VECTOR2.M[4].C=new Color(255,255,0); M.C.VECTOR1.M[4].C=new Color(255,0,0); M.C.SCALE.val=5; M.H.POLY.forceMode(4); M.PD1.INDEX=9; M.PD1.PARITY.val=0; } public void viewFractalParam() { resetProgram(); M.C.FRACTAL1.forceMode(2); M.C.FRACTAL2.forceMode(2); M.C.SCALE.val=0; } public void viewFractal() { resetProgram(); M.C.FRACTAL1.forceMode(6); M.C.FRACTAL2.forceMode(6); M.C.FRACTAL1.M[6].C=new Color(220,0,0); M.C.FRACTAL2.M[6].C=new Color(50,100,255); M.C.SCALE.val=0; } public void viewIdealSub() { resetProgram(); M.C.SUBS.forceMode(0); M.C.REFINE.forceMode(1); M.C.EDGE2.forceMode(2); M.C.VECTOR1.L[2].on=1; M.C.VECTOR1.L[6].on=1; M.C.VECTOR2.L[2].on=1; M.C.VECTOR2.L[6].on=1; M.C.VECTOR2.M[2].C=new Color(255,255,0); M.C.VECTOR1.M[2].C=new Color(255,255,0); M.C.VECTOR2.M[6].C=new Color(0,0,255); M.C.VECTOR1.M[6].C=new Color(0,0,255); M.C.SCALE.val=5; } public void resetOuterBilliards() { int temp2=PolyData.getNumber(M.PD1.SOURCE); int p=M.PD1.PARITY.val; if(POLY.mode==0) { M.PD1.ITER.max=OuterBilliards.suggestedReturn(temp2,p); M.PD1.ITER.val=OuterBilliards.suggestedReturn(temp2,p); } } public void mouseClicked(MouseEvent e) { MouseData J=MouseData.process(e); SHORTCUT.switchMode(J.X); shortcut(J.X); POLY.switchMode(J.X); if(POLY.isModified(J.X)==1) { M.PD2.ORBIT.val=M.PD1.ORBIT.val+1; if(POLY.mode==0) resetOuterBilliards(); if(POLY.mode==3) M.PD1.SITE.val=0; if(POLY.mode==4) M.PD1.SITE.val=M.PD1.INDEX; if(POLY.mode==6) M.PD1.SITE.val=M.PD1.INDEX; } TEXT.switchMode(J.X); if(TEXT.isModified(J.X)==1) { resetProgram(); if(TEXT.mode==5) POLY.forceMode(4); } M.repaint(); } }