import java.applet.Applet; import java.awt.event.*; import java.awt.*; import java.awt.geom.*; /*This class draws the unfolding of a word relative to a triangle. It is the analog of the unfold window in McBilliards.*/ public class UnfoldCanvas extends DBCanvas { ListenTriangle[] T=new ListenTriangle[301]; PictureCanvas P; int mode,yes,show; double overfill,t1,t2,XPOS,YPOS; String W; public UnfoldCanvas(PictureCanvas P) { this.P=P; for(int i=0;i<=300;++i) T[i]=new ListenTriangle(); W=""; XPOS=0.5; YPOS=0.5; mode=1; show=0; overfill=1; yes=0; t1=0; t2=0; } public void paint (Graphics gfx) { Graphics2D g=(Graphics2D) gfx; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); doUnfold(); g.translate(0,-25); drawUnfold(g); g.translate((int)(P.C.shift),0); drawBilliardPath(g); g.translate(0,25); } public void drawBilliardPath(Graphics g) { if((t1>0.000000001)&&(yes*show==1)) { g.setColor(new Color(255,150,0)); g.drawLine(0,(int)(t1),1040,(int)(t1)); g.drawLine(0,(int)(t2),1040,(int)(t2)); } } public void drawUnfold(Graphics2D g) { int n=W.length(); g.translate((int)(-P.C.shift),0); Color C1=new Color(0,50,50); Color C2=new Color(0,200,200); for(int i=1;i<=n;++i) { T[i].renderSmooth(g,C1,C2); } /*first and last edge*/ if(n>1) { String S=W.substring(0,1); int nn=-1; if(S.compareTo("1")==0) nn=0; if(S.compareTo("2")==0) nn=1; if(S.compareTo("3")==0) nn=2; T[1].edgeRenderSmooth(g,nn,Color.yellow); T[n].edgeRenderSmooth(g,nn,Color.yellow); } } public void drawCoords(Graphics g) { g.setFont(new Font("Helvetica",Font.PLAIN,12)); g.setColor(new Color(255,0,255)); g.drawString("x Pi/2",910,18); g.setColor(Color.white); g.setFont(new Font("Helvetica",Font.PLAIN,10)); doubleRender(XPOS,g,760,12); doubleRender(YPOS,g,760,23); } public void wordRender(String W,Graphics g) { g.setColor(Color.black); g.fillRect(1,0,1098,26); g.setColor(new Color(100,0,100)); g.drawRect(1,0,1098,26); g.setFont(new Font("Helvetica",Font.PLAIN,20)); g.setColor(Color.white); int start=0; int stop=0; int n=W.length(); g.setFont(new Font("Helvetica",Font.PLAIN,10)); g.setColor(Color.white); if (n<=116) g.drawString(W,4,12); if (n>116) { String W1=W.substring(1,116); String W2=W.substring(117,n); g.drawString(W1,4,11); g.drawString(W2,4,22); } } /*unfold routines*/ public ListenTriangle[] rawUnfold(ListenTriangle A,String W) { ListenTriangle[] T1=new ListenTriangle[300]; for(int i=0;i<=299;++i) T1[i]=new ListenTriangle(); T1[0]=A; int n=W.length(); int digit=-1; String S=new String(); if(n>0) { for(int i=0;i0) { for(int i=0;i<=n;++i) T2[i]=T1[i].rotate(z); } return(T2); } /**this routine fits the object in the bounding box*/ public ListenTriangle[] fit(double X,double Y,ListenTriangle[] T2,int n,int mode) { double mx=1000000; double my=1000000; double Mx=-1000000; double My=-1000000; for(int i=1;i<=n;++i) { for(int j=0;j<=2;++j) { if(mx>T2[i].z[j].x) mx=T2[i].z[j].x; if(my>T2[i].z[j].y) my=T2[i].z[j].y; if(Mxss) s=ss; Complex z1=new Complex(-s*mx+10,Y-s*(My+my)/2.0); for(int i=0;i<=n;++i) T3[i]=T2[i].scale(z1,s); } if(mode>=2) { if(mode==3) ss=2.0*ss; if(mode==4) ss=4.0*ss; if(mode==5) ss=8.0*ss; Complex z1=new Complex(-ss*mx+10,Y-ss*(My+my)/2.0); for(int i=0;i<=n;++i) T3[i]=T2[i].scale(z1,ss); if(ss>s) overfill=ss/s; } P.C.overfill=overfill; return(T3); } public void getCorridor(ListenTriangle[] T3,int n) { Corridor C=new Corridor(); C.compute(W,T3,n); double top=C.t1; double bot=C.t2; yes=0; t1=C.t1; t2=C.t2; if(C.t1>C.t2) {yes=1;} } public void doUnfold() { Complex z=new Complex(XPOS,YPOS); int q=P.getIndex(); if(q>=7) { String W=P.P[q].W; int n=W.length(); ListenTriangle[] T1=rawUnfold(T[0].init(z),W); ListenTriangle[] T2=rotateHorizontal(T1,n); ListenTriangle[] T3=new ListenTriangle[300]; T3=fit(980,93,T2,n,mode); getCorridor(T3,n); for(int i=0;i<=n;++i) T[i]=T3[i]; } } public Complex[] rawPath(String W) { Complex[] V=new Complex[300]; String S=new String(); double pi=Math.PI; double arg1=pi/6+pi/2; double arg2=arg1+2*pi/3; double arg3=arg2+2*pi/3; Complex v1=new Complex(Math.cos(arg1),Math.sin(arg1)); Complex v2=new Complex(Math.cos(arg2),Math.sin(arg2)); Complex v3=new Complex(Math.cos(arg3),Math.sin(arg3)); Complex v4=new Complex(0,0); Complex v5=new Complex(0,0); Complex vv=new Complex(0,0); int n=W.length(); for(int i=0;iV[i].x) mx=V[i].x; if(MxV[i].y) my=V[i].y; if(My0) { Complex[] V=rawPath(W); Complex[] Z=getLocation(V,n); double size=Z[0].x; if(size4) g.drawString(I.toString(n[i]), x+-13+7*i,y+12); } } }