package Current.popups.Unfold; import Current.*; import Current.basic.*; public class Corridor { public double t1,t2; public int i1,i2; public int ii1,ii2; public VertexPair V; public Corridor() {} /***this is positive iff there is a billiard path*/ public void compute(String W,ListenTriangle[] T2,int n) { i1=0; i2=0; ii1=0; ii2=0; int digit=0; int temp=0; /*first compute top*/ double top=-100000; double yy=-100000.0; for(int i=n-1;i>=0;--i) { digit=1+Converter.getDigit(W,i); if((digit==1)&&(i%2==0)) {temp=1;yy=T2[i+1].z[1].y;} if((digit==2)&&(i%2==0)) {temp=2;yy=T2[i+1].z[2].y;} if((digit==3)&&(i%2==0)) {temp=0;yy=T2[i+1].z[0].y;} if((digit==1)&&(i%2==1)) {temp=2;yy=T2[i+1].z[2].y;} if((digit==2)&&(i%2==1)) {temp=0;yy=T2[i+1].z[0].y;} if((digit==3)&&(i%2==1)) {temp=1; yy=T2[i+1].z[1].y;} if(top=0;--i) { digit=1+Converter.getDigit(W,i); if((digit==1)&&(i%2==1)) {temp=1;yy=T2[i+1].z[1].y;} if((digit==2)&&(i%2==1)) {temp=2;yy=T2[i+1].z[2].y;} if((digit==3)&&(i%2==1)) {temp=0;yy=T2[i+1].z[0].y;} if((digit==1)&&(i%2==0)) {temp=2;yy=T2[i+1].z[2].y;} if((digit==2)&&(i%2==0)) {temp=0;yy=T2[i+1].z[0].y;} if((digit==3)&&(i%2==0)) {temp=1; yy=T2[i+1].z[1].y;} if(bot>yy) {bot=yy;t2=bot;i2=i+1;ii2=temp;} } } public VertexPair getLeader(String W,Complex Z) { int n=W.length(); ListenTriangle[] T1=UnfoldCanvas.rawUnfold(ListenTriangle.init(Z),W); ListenTriangle[] T2=UnfoldCanvas.rotateHorizontal(T1,n); compute(W,T2,n); VertexPair V=new VertexPair(1,this.i1,2,this.i2); return(V); } public static double geometricEvaluate(String W,VertexPair V,Complex Z,int debug) { int n=W.length(); ListenTriangle[] T1=UnfoldCanvas.rawUnfold(ListenTriangle.init(Z),W); ListenTriangle[] T2=UnfoldCanvas.rotateHorizontal(T1,n); CombinatorialTriangle[] CT=CombinatorialTriangle.unfold(W); int a1=Converter.coordsToType(CT[V.e1],V.o1); int a2=Converter.coordsToType(CT[V.e2],V.o2); int s=Converter.spineNumber(V,CT); Complex z1=T2[V.e1].z[a1]; Complex z2=T2[V.e2].z[a2]; Complex z3=Complex.minus(z1,z2); double scale=1; if(s==0) scale=Math.sin(Math.PI*Z.x*0.5); if(s==1) scale=Math.sin(Math.PI*Z.y*0.5); if(s==2) scale=Math.sin(Math.PI*(2-Z.x-Z.y)*0.5); return(z3.y/(scale*scale)); } }