import java.applet.Applet; import java.awt.*; import java.awt.event.*; import java.applet.*; import java.awt.geom.*; import java.math.*; public class PolyData { int type; public static Poly P1(int k) { if(k==0) return P0(); if(k==1) return P1(); if(k==2) return P2(); if(k==3) return P3(); if(k==4) return P4(); if(k==5) return P5(); if(k==6) return P6(); if(k==7) return P7(); if(k==8) return P8(); if(k==9) return P9(); if(k==10) return P10(); return(null); } public static int getNumber(Complex z) { GeneralPath gp=new GeneralPath(); for(int i=0;i<22;++i) { gp=P(i).toGeneralPath(); if(gp.contains(z.x,z.y)==true) return(i); } return(-1); } public static Complex specialPoint0(int n) { double x=1+Math.sqrt(2); x=x+Math.pow(Math.sqrt(2)-1,n); return(new Complex(x,2)); } public static Complex getGraph(int choice,int k) { Complex[] Z=graph(k); return(Z[choice]); } public static Complex getGraph2(int k,int parity) { Complex z=getGraph(2,k); if(parity==1) z=new Complex(-z.x,-z.y); return(z); } public static Complex getGraph3(int k,int parity) { int kk=k; if(parity==1) kk=k-11; Complex z=getGraph(3,kk); if(parity==1) z=new Complex(-z.x,-z.y); return(z); } public static Poly P(int k) { if(k<11) return(P1(k)); if(k>10) return(rotate2(4,P1(k-11))); return(null); } public static Poly PP(int k) { Poly Q=P(k); Complex[] Z=graph(k); Q=Q.translate(Z[1]); return(Q); } public static Complex[] graph(int k) { if(k==0) return(graph0()); if(k==1) return(graph1()); if(k==2) return(graph2()); if(k==3) return(graph3()); if(k==4) return(graph4()); if(k==5) return(graph5()); if(k==6) return(graph6()); if(k==7) return(graph7()); if(k==8) return(graph8()); if(k==9) return(graph9()); if(k==10) return(graph10()); if(k==11) return(graph11()); if(k==12) return(graph12()); if(k==13) return(graph13()); if(k==14) return(graph14()); if(k==15) return(graph15()); if(k==16) return(graph16()); if(k==17) return(graph17()); if(k==18) return(graph18()); if(k==19) return(graph19()); if(k==20) return(graph20()); if(k==21) return(graph21()); return(null); } public static Poly P0() { Poly P=new Poly(); P.count=8; double x=Math.sqrt(2); Complex w=new Complex(x/2,x/2); Complex[] W=new Complex[8]; W[0]=new Complex(w); for(int i=1;i<8;++i) W[i]=Complex.times(W[i-1],w); for(int i=0;i<8;++i) W[i]=Complex.times(W[i],new Complex(x-1,0)); Complex CENTER=new Complex(2+x,2); for(int i=0;i<8;++i) { P.z[i]=Complex.plus(CENTER,W[i]); } return(P); } public static Poly P1() { Poly P=new Poly(); P.count=3; double s=Math.sqrt(2)+1; P.z[0]=new Complex(2*s,4); P.z[1]=new Complex(s+3,3*s-3); P.z[2]=new Complex(3*s-2,2*s-1); for(int i=0;i<3;++i) P.z[i]=Complex.times(new Complex(.5,0),P.z[i]); return(P); } /**This one gets subdivided into two pieces*/ public static Poly Q2() { Poly P=new Poly(); P.count=4; double x=Math.sqrt(2); P.z[0]=new Complex(2+x/2,3*x/2); P.z[1]=new Complex(1.0/2+3*x/2,1.0/2+x); P.z[2]=new Complex(1+3*x/2,1+x/2); P.z[3]=new Complex(3.0/2+x,3.0/2+x/2); return(P); } public static Poly P2() { return(rotate4(3,P1())); } public static Poly P3() { Poly P=new Poly(); P.count=5; double x=Math.sqrt(2); double s=Math.sqrt(2)+1; P.z[0]=new Complex(5*s-6,2*s-1); P.z[1]=new Complex(4*s-4,4*s-6); P.z[2]=new Complex(3*s-2,2*s-1); P.z[3]=new Complex(s+3,3*s-3); P.z[4]=new Complex(2*s+1,s+2); for(int i=0;i<5;++i) P.z[i]=Complex.times(new Complex(.5,0),P.z[i]); return(P); } public static Poly P4() { return(rotate4(5,P1())); } public static Poly P5() { Poly Q=rotate1(5,P1()); return(Q); } public static Poly P6() { Poly Q=rotate1(5,Q2()); return(Q); } public static Poly P7() { Poly Q=rotate1(5,P4()); return(Q); } public static Poly P8() { Poly Q=rotate1(2,P1()); return(Q); } public static Poly P9() { Poly Q=rotate1(2,Q2()); return(Q); } public static Poly P10() { Poly Q=rotate1(2,P4()); return(Q); } public static Poly rotate1(int k,Poly P) { Poly Q=new Poly(P); double x=Math.sqrt(2); Complex CENTER=new Complex(2+x,2); return(rotate(CENTER,k,P)); } public static Poly rotate2(int k,Poly P) { Poly Q=new Poly(P); double s=Math.sqrt(2)+1; Complex CENTER=new Complex(3*s/2,3.0/2); return(rotate(CENTER,k,P)); } public static Poly rotate4(int k,Poly P) { Poly Q=new Poly(P); double x=Math.sqrt(2); Complex CENTER=new Complex(2*x,2); return(rotate(CENTER,k,P)); } public static Poly rotate(Complex CENTER,int k,Poly P) { Poly Q=new Poly(P); double x=Math.sqrt(2); Complex z1=new Complex(CENTER); Complex z2=new Complex(-z1.x,-z1.y); Q=Q.translate(z2); Complex u=new Complex(x/2,x/2); Complex w=new Complex(1,0); for(int i=0;i