package Current.plot.Dyadic; import Current.basic.*; import Current.popups.Unfold.*; import java.applet.Applet; import java.awt.event.*; import java.awt.*; public class Spine { /**This class contains methods which extract the defining functions from the combinatorial information calculated when we perform the combinatorial version of the unfolding. This class is really central for the plotter.*/ public Spine() {} /* public static int spineNumber(VertexPair V,CombinatorialTriangle[] T) { int n1=Converter.coordsToType(T[V.e1],V.o1); int n2=Converter.coordsToType(T[V.e2],V.o2); if(n1!=n2) return(3-n1-n2); if(n1==2) return(1); return(2); } */ /**a return of -1 means that the pair is misordered 1 means that the pair is correctly ordered 2 or 3 means that the vertices are the two endpoints of an interior edge */ public static int pairOrdering(VertexPair V,CombinatorialTriangle[] CT) { int n1,n2,n3,n4; n1=CT[V.e1].c[V.o1]; n2=CT[V.e2].c[V.o2]; n3=CT[V.e1].c[3-V.o1]; n4=CT[V.e2].c[3-V.o2]; if(V.o1==V.o2) { if(n1==n2) return(0); if(n1n2) return(-1); } if((n1==n4)) return(2); if((n2==n3)) return(3); if(n3=last) {n[1]=first;n[0]=1;n[2]=convention;n[3]=spine;return(n);} //exceptional count=2; for(int i=first+1;i=last) { E.x=convention*Math.cos(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); E.y=convention*Math.sin(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); return(E); } //general case E.x=convention*Math.cos(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); E.y=convention*Math.sin(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); int sign=-1; for(int i=first+1;i=last) { cf=CT[first].d[spine][q-1]; E.x=-cf*convention*Math.sin(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); E.y=cf*convention*Math.cos(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); return(E); } //general case cf=CT[first].d[spine][q-1]; E.x=-cf*convention*Math.sin(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); E.y=cf*convention*Math.cos(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); int sign=-1; for(int i=first+1;i=last) { if(q==0) cf=CT[first].d[spine][0]*CT[first].d[spine][0]; if(q==1) cf=CT[first].d[spine][1]*CT[first].d[spine][0]; if(q==2) cf=CT[first].d[spine][1]*CT[first].d[spine][1]; E.x=-cf*convention*Math.cos(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); E.y=-cf*convention*Math.sin(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); return(E); } //general case if(q==0) cf=CT[first].d[spine][0]*CT[first].d[spine][0]; if(q==1) cf=CT[first].d[spine][1]*CT[first].d[spine][0]; if(q==2) cf=CT[first].d[spine][1]*CT[first].d[spine][1]; E.x=-cf*convention*Math.cos(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); E.y=-cf*convention*Math.sin(CT[first].d[spine][0]*Z.x+CT[first].d[spine][1]*Z.y); int sign=-1; for(int i=first+1;i=0) return(2); double max=evaluate(sign,V,CT,d,ZZ[0]); if(max<=0) return(1); return(0); } public static int signEvaluate(int sign,VertexPair V,CombinatorialTriangle[] CT,Complex[] data,DyadicSquare Q,int direction) { if(direction==0) return(0); Complex[] ZZ=getRelevant(Q,direction); int pos1=direction; int pos2=direction+4; if(pos2>8) pos2=pos2-8; double min=evaluate(sign,V,CT,data[pos2],ZZ[1]); if(min>=0) return(2); double max=evaluate(sign,V,CT,data[pos1],ZZ[0]); if(max<=0) return(1); return(0); } public static int crudePositiveTest(int sign,VertexPair V,CombinatorialTriangle[] CT,int[][] d,DyadicSquare Q,int[] a) { double[] x=new double[20]; Complex Z=Q.getCenter(); x[0]=evaluate(sign,V,CT,d,Z); x[1]=Math.PI*Math.pow(0.5,Q.k+2); x[2]=x[1]*x[1]; x[3]=Math.abs(gradient(sign,1,V,CT,d,Z)); x[4]=Math.abs(gradient(sign,2,V,CT,d,Z)); x[5]=x[1]*(x[3]+x[4]); x[9]=x[2]*(a[0]+2*a[1]+a[2]); x[10]=x[5]+x[9]; x[11]=x[0]-x[10]; if(x[11]>0) return(1); return(0); } public static int crudePositiveTest(int sign,VertexPair V,CombinatorialTriangle[] CT,Complex[] data,DyadicSquare Q,int[] a) { double[] x=new double[20]; Complex Z=Q.getCenter(); x[0]=evaluate(sign,V,CT,data[0],Z); x[1]=Math.PI*Math.pow(0.5,Q.k+2); x[2]=x[1]*x[1]; x[3]=Math.abs(gradient(sign,1,V,CT,data[0],data[9],Z)); x[4]=Math.abs(gradient(sign,2,V,CT,data[0],data[10],Z)); x[5]=x[1]*(x[3]+x[4]); x[9]=x[2]*(a[0]+2*a[1]+a[2]); x[10]=x[5]+x[9]; x[11]=x[0]-x[10]; if(x[11]>0) return(1); return(0); } public static int[] completeList(int ii,CombinatorialTriangle[] CT) { int count,OLD,NEW; int[] n=new int[CT[0].c[0]]; count=0; OLD=1; for(int i=1;i<=CT[0].c[0];++i) { NEW=CT[i].c[ii]; if(NEW>OLD) { OLD=NEW; ++count; n[count]=i-1; } } if(2*countvertex)) s[1]=i; } if(s[0]==0) s[0]=1; return(s); } }