/* * LoopWord.java * * Created on October 27, 2005, 2:43 PM */ package Current.plot.BilliardLike; import java.util.*; import java.awt.Color; import java.awt.geom.GeneralPath; import Current.basic.*; /** * * @author pat */ public class LoopWord { public class Edge { int i; // index boolean dir; // true-> forward direction public Edge(int I, boolean DIR){ i=I; dir=DIR; } public Edge(Edge e){ i=e.i; dir=e.dir; } public boolean equals(Edge e){ return ((i==e.i)&&(dir==e.dir)); } public boolean equals(Object e){ return equals((Edge) e); } public int eval(){ return x[i]; } public int evalNext(){ if (dir) return x[(i+1)%x.length]; else return x[(i+x.length-1)%x.length]; } public int evalPrev(){ if (dir) return x[(i+x.length-1)%x.length]; else return x[(i+1)%x.length]; } public void inc(){ if (dir){ i=(i+1)%x.length; } else { i=(i+x.length-1)%x.length; } } public void dec(){ if (dir){ i=(i+x.length-1)%x.length; } else { i=(i+1)%x.length; } } public Edge incCopy(){ if (dir) return new Edge((i+1)%x.length,dir); return new Edge((i+x.length-1)%x.length,dir); } public Edge decCopy(){ if (dir) return new Edge((i+x.length-1)%x.length,dir); return new Edge((i+1)%x.length,dir); } public boolean leftOf(Edge E){ if (dir^(i%2==1)) { // xor return (eval()==(E.eval()+2)%3); } else { return (eval()==(E.eval()+1)%3); } } public boolean rightOf(Edge E){ if (dir^(i%2==1)) { // xor return (eval()==(E.eval()+1)%3); } else { return (eval()==(E.eval()+2)%3); } } public void print(){ System.out.print(""+i+(dir?"T":"F")); } public String toString(){ return ""+i+(dir?"T":"F"); } } public class LeftOfOrder implements Comparator { /** Return -1 if E is to the left of E1. * Return 1 if E1 is to the left of E. Return 0 if they are equal */ public int compare(Edge E, Edge E1) { if (E.equals(E1)) return 0; Edge e=new Edge(E); Edge e1=new Edge(E1); while (e.eval()==e1.eval()){ e.inc(); e1.inc(); } if (e.leftOf(e1)) return -1; else return 1; } public int compare(Object obj, Object obj1) { return compare((Edge)obj,(Edge)obj1); } } protected class VertexNames{ int[] rs, ls; int lmax,rmax; public int get(int a, int b) { if (a==0) return ls[b]; else return rs[b]; } public VertexNames(){ rs=new int[x.length]; ls=new int[x.length]; rs[0]=1; ls[0]=1; for (int i=1; i0 L.add(new RationalLine( hp2.p[0]-hp1.p[0], hp2.p[1]-hp1.p[1], hp2.p[2]-hp1.p[2])); // angle difference0 if (!ch.add( hp2.p[0]-hp1.p[0], hp2.p[1]-hp1.p[1], hp2.p[2]-hp1.p[2])) return null; // angle difference-pi // ch.add( // 1+(hp2.p[0]-hp1.p[0]), // 1+(hp2.p[1]-hp1.p[1]), // 1+(hp2.p[2]-hp1.p[2])); // // // angle difference