public class LineList { static final boolean DEBUG=false; Node listp; public LineList() { listp=null; } public InterestingPoint [] Insert(Line line, float x) { Node node=new Node(line, null); Node temp=listp; InterestingPoint[] intersections=new InterestingPoint[2]; intersections[0]=null; intersections[1]=null; if(DEBUG) System.out.println("LineList Insert: line "+ line); if(listp==null) { node.up=null; node.next=null; listp=node; return intersections; } while( temp.next!=null && ((Line)temp.data).YIntersect(x) > line.YIntersect(x) ) { if(DEBUG) System.out.println("LineList Insert: temp.next!=null"); temp=temp.next; } if( ((Line)temp.data).YIntersect(x) > line.YIntersect(x) ) { if(DEBUG) System.out.println("LineList Insert: Appending"); if(temp.next==null) { node.next=null; }else{ node.next=temp.next; node.next.up=node; } temp.next=node; node.up=temp; if(node.up==null) if(DEBUG) System.out.println("LineList Insert: line "+line+ " has null up pointer"); }else{ if(DEBUG) System.out.println("LineList Insert: Inserting"); if(temp==listp) { if(DEBUG) System.out.println("LineList Insert: temp==listp"); node.up=null; node.next=listp; listp.up=node; listp=node; node.next.up=node; }else{ if(DEBUG) System.out.println("LineList Insert: temp= "+ temp.data+ " ; node = "+node.data); node.next=temp; node.up=temp.up; if(temp.up!=null) temp.up.next=node; temp.up=node; } } point p; if(node.up!=null) { p=line.Intersect( (Line)node.up.data ); if(p!=null) intersections[0]=new InterestingPoint(line,(Line)node.up.data,p); } if(node.next!=null) { p=line.Intersect( (Line)node.next.data ); if(p!=null) intersections[1]=new InterestingPoint(line,(Line)node.next.data,p); } return intersections; } public InterestingPoint [] Swap(Line l1, Line l2) { Node temp=listp, up, next; InterestingPoint[] ips=new InterestingPoint[2]; ips[0]=null;ips[1]=null; while(temp.data!=(Object)l1 && temp.data!=(Object)l2) { temp=temp.next; } Object data; data=temp.data; temp.data=temp.next.data; temp.next.data=data; // now we check for new intersections point p; if(temp.up!=null) { p=((Line)temp.data).Intersect( (Line)temp.up.data ); if(p!=null) ips[0]=new InterestingPoint((Line)temp.data,(Line)temp.up.data,p); } if(temp.next.next!=null) { p=((Line)temp.next.data).Intersect( (Line)temp.next.next.data ); if(p!=null) ips[1]=new InterestingPoint((Line)temp.next.data,(Line)temp.next.next.data,p); } return ips; } public InterestingPoint Delete(Line line) { if(DEBUG) System.out.println("LineList Delete: Before: "+this); Node temp=listp; InterestingPoint ip=null; point p; if(DEBUG) System.out.println("LineList Delete: Deleting line "+ line); while(! ((Line)temp.data).Compare(line) ) temp=temp.next; if(temp==listp) { listp=temp.next; if(listp!=null && listp.next!=null) listp.next.up=listp; }else{ if(DEBUG) System.out.println("LineList Delete: temp= "+(Line)temp.data); if(DEBUG) System.out.println("LineList Delete: temp.up= "+(Line)temp.up.data); temp.up.next=temp.next; if(temp.next!=null) temp.next.up=temp.up; } if(temp.up!=null && temp.next!=null) { p=((Line)temp.up.data).Intersect( (Line)temp.next.data ); if(p!=null) ip=new InterestingPoint((Line)temp.next.data,(Line)temp.up.data,p); } if(DEBUG) System.out.println("LineList Delete: After: "+this); return ip; } public String toString() { Node temp=listp; StringBuffer s=new StringBuffer("listp->"); if(listp==null) return s.toString(); s.append("*X*"); s.append(((Line)listp.data) + "->"); while(temp.next!=null) { if(temp.next.up==null) s.append("*X*"); s.append(((Line)temp.next.data) + "->"); temp=temp.next; } s.append("\nBackwards"); while(temp!=listp) { s.append(((Line)temp.data) + "->"); temp=temp.up; } s.append(((Line)listp.data)); return s.toString(); } } // LineList