import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.applet.*; import java.awt.geom.*; import java.math.*; /**This computes the tiling in the 2D dynamical plane.**/ public class ComputeOuter implements Runnable { int halt; Manager M; public ComputeOuter() {} public ComputeOuter(Manager MM) { this.M=MM; } public void run() { int mode=M.C.CON_T.MULTI.mode; PolyWedge W=new PolyWedge(); int k=M.C.CON_T.ITER.val; int iter=M.C.CON_T.MAP.mode+1; if(mode==1) runTile(); if(mode==2) runStrip(); if(mode==3) runRenorm(); M.T.repaint(); } public void runTile() { PolyWedge W=makeTile(M.T.SOURCE); boolean v=M.C.CON_T.getVerify(); TileStats.stats(M.C,W,M.T.SOURCE,1,v); int mode=M.C.CON_T.OUTER.mode; int k=M.C.CON_T.ITER.val; int map=M.C.CON_T.MAP.mode+1; if(mode==0) sendIterates(1,W,1); if(mode==1) sendIterates(map,W,k); if(mode==2) sendIterates(map,W,W.orbit); if(mode==3) sendStripReturn(W,k); if(mode==4) sendStripReturn(W,W.strip); if(mode==5) sendTriReturn(W,k); } public void runStrip() { int mode=M.C.CON_T.STRIP.mode; int nat=M.C.CON_T.NATURAL.mode; int k=M.C.CON_T.ITER.val; PolyWedge W=new PolyWedge(); if(mode==0) W=makeReturnTile(M.T.SOURCE,k); if(mode==1) W=makeReturnTileForward(M.T.SOURCE,k); if(mode==2) W=makeReturnTileBackward(M.T.SOURCE,k); Color C=M.K.SC.C; if(nat==1) { boolean test=comesCloser(M.T.SOURCE,k,mode); if(test==false) C=M.C.CON_T.COLORS.L[2].C; if(test==true) C=M.C.CON_T.COLORS.L[3].C; } boolean v=M.C.CON_T.getVerify(); TileStats.stats(M.C,W,M.T.SOURCE,2,false); M.T.addPoly(W,C); } public void runRenorm() { int mode=M.C.CON_T.RENORM.mode; if(mode==0) doRenorm(false,false); if(mode==1) doRenorm(true,false); if(mode==2) doRenormFill(false); if(mode==3) doRenormFill(true); } /**This is the main routine. It computes the orbit tile.**/ public PolyWedge makeTile(Complex zz) { PolyWedge KITE=PolyWedge.penroseKite(); if(KITE.inside(zz)==true) return(null); halt=1; PinwheelMap PIN=new PinwheelMap(); Complex z=OuterBilliards.goodStart(zz); int sector=PIN.findSector(z); Complex z1=PIN.E(sector%4,z); double[][] d={{1,-1},{1,-1},{1,-1},{1,-1}}; int test=0; int count=0; int orbit=0; int choice=0; while((count<10000000)&&(halt==1)&&(test==0)) { choice=(sector+count)%4; double temp=PIN.getStripPosition(choice,z); orbit=orbit+(int)(Math.abs(PIN.getDepth(choice,z))); z=PIN.E(choice,z); if(d[choice][0]>temp) d[choice][0]=temp; if(d[choice][1]1)&&(dist<.00000001)) test=1; ++count; } halt=0; if(count>99998) orbit=0; PolyWedge W=PIN.createShape(d,zz); boolean v=M.C.CON_T.getVerify(); if(v==true) W=trim(W); W.orbit=orbit-1; W.strip=count/8; return(W); } public PolyWedge trim(PolyWedge W) { double[] d={0,2}; if(M.T.SOURCE.y<0) d[1]=-2; PolyWedge X=PolyWedge.merge(W,PolyWedge.strip(1000,d)); return(X); } public void sendSingle(PolyWedge W) { Complex z=W.getCenter(); int test=OuterBilliards.positiveTest(z)+OuterBilliards.negativeTest(z); if(test!=0) M.T.addPoly(W); } public void sendIterates(int skip,PolyWedge W,int kk) { int k=kk; if(kk>10000) k=10000; PolyWedge W2=new PolyWedge(W); for(int i=0;i10000) k=10000; Complex z=W2.getCenter(); double test=Math.abs(z.y); if(test>1.9999999) k=1; if(test>2.0000001) k=0; int test2=OuterBilliards.negativeTest(z)+OuterBilliards.positiveTest(z); if(test2==0) k=0; PolyWedge P=PolyWedge.penroseKite(); PinwheelMap PIN=new PinwheelMap(); for(int i=0;iX.z[i].y) min=X.z[i].y; if(maxmax) return(false); return(true); } public void doRenormFill(boolean restrict) { System.out.println("public static int[][] cover(int k) {"); System.out.print("int[][][] A={"); periodFill(restrict); bandFillA(restrict); System.out.println("};return(A[k]);}"); System.out.println(""); } public void bandFillA(boolean restrict) { Vector V=TorusMap.theta(M.T.SOURCE); int t=PolyhedronExchange.classify(V); for(int LA=0;LA<5;++LA) { for(int LB=0;LB<6;++LB) { for(int b=0;b<4;++b){ if(goodIndex(LA,LB,restrict)==true) bandFillA(LA,LB,b,t,restrict); } } } } public void bandFillA(int LA,int LB,int branch,int t,boolean restrict) { int max=0; Vector V=TorusMap.theta(M.T.SOURCE); int lim=DataRenormReturn.limits(LB,branch); double[] d=Characteristics.getHeightA(LA,LB); for(int i=0;i