/* * CycleList.java 2004-11-04 * * Dirk Ansorge, FernUniversitaet Hagen * */ package twodsack.util.collection; import twodsack.set.*; import twodsack.setelement.*; import twodsack.setelement.datatype.basicdatatype.*; import twodsack.util.*; import twodsack.util.collectiontype.*; import twodsack.util.comparator.*; import java.util.*; /** * The CycleList class is simply a class with a different name for {@link java.util.LinkedList}. * It is used as return type or parameter type for several methods. This list should be used to * hold lists of segment cycles as shown below. *

( ((a,b)(b,c)(c,a)), ((e,f)(f,g)(g,e)), ... ) */ public class CycleList extends LinkedList { private static final SegmentComparator SEGMENT_COMPARATOR = new SegmentComparator(); /** * Prints the elements of this to standard output. */ public void print() { if (this.size() == 0) { System.out.println("List is empty."); }//if LinkedList actList; for (int i = 0; i < this.size(); i++) { actList = (LinkedList)this.get(i); System.out.println("--- Cycle No."+i+" ---"); for (int j = 0; j < actList.size(); j++) { ((Element)(actList.get(j))).print(); }//for j }//for i }//end method print /** * Returns a 'deep' copy of this. * This means, that changes on the copy don't affect this. * * @return the copy */ public CycleList copy() { CycleList copy = new CycleList(); Iterator it = this.listIterator(0); Iterator it2; while (it.hasNext()) { LinkedList cycleCopy = new LinkedList(); it2 = ((LinkedList)it.next()).listIterator(0); while (it2.hasNext()) cycleCopy.add(((Element)it2.next()).copy()); copy.add(cycleCopy); }//while it return copy; }//end method copy /** * Returns true, if this is a list of proper cycles.

* Checks the connectivity of the cycles of this by traversing the segment lists and checking for equality of vertices.

* The cycles must have the following structure:

* ( (a,b)(b,c)(c,d)(d,a) )

* If they do, true is returned. false otherwise. If a cycle's size is smaller than 3, false is returned. * Note, that is is not checked, whether segments intersect, which is not allowed for proper cycles. Furthmore, one should know that * this method ONLY works for lists of Segments. * @return true if this is a proper cycle. */ public boolean checkCycles() { ListIterator lit = this.listIterator(0); Iterator outerIT = this.listIterator(0); LinkedList actCycle; int num = 0; while (outerIT.hasNext()) { actCycle = (LinkedList)outerIT.next(); if (actCycle.size() < 3) { System.out.print("-TOOLESSSEGMENTS"); return false; }//if Iterator it = actCycle.listIterator(0); Segment firstSeg; Segment nextSeg; Segment initialSeg; firstSeg = (Segment)it.next(); nextSeg = (Segment)it.next(); initialSeg = firstSeg; if (!firstSeg.getEndpoint().equal(nextSeg.getStartpoint())) { System.out.print("-FIRSTSEGDOESNTFIT"); return false; }//if while (it.hasNext()) { num++; firstSeg = nextSeg; nextSeg = (Segment)it.next(); if (!firstSeg.getEndpoint().equal(nextSeg.getStartpoint())) { System.out.println("-SOMESEGDONTFIT(NUM:"+num+"/"+actCycle.size()+")"); int lowBound; int highBound; if (num > 2) lowBound = num-2; else lowBound = 0; if (num+2 < actCycle.size()) highBound = num+2; else highBound = actCycle.size(); for (int n = lowBound; n < highBound; n++) { System.out.println("["+n+"]: "+(Segment)actCycle.get(n)); } return false; }//if }//while it if (!nextSeg.getEndpoint().equal(initialSeg.getStartpoint())) { System.out.print("-CIRCLESEGDOESNTFIT"); return false; }//if }//while outerIT return true; }//end method checkCycle /** * Stores all segments of inlist in a SegMultiSet. * * @param inlist the list that shall be converted * @return the new SegMultiSet */ public static SegMultiSet convert(CycleList inlist) { SegMultiSet retSet = new SegMultiSet(SEGMENT_COMPARATOR); Iterator it = inlist.iterator(); LinkedList actList; Iterator it2; while (it.hasNext()) { actList = (LinkedList)it.next(); it2 = actList.iterator(); while (it2.hasNext()) retSet.add((Segment)it2.next()); }//while return retSet; }//end method convert /** * Returns the bounding box of the cycle. * * @return the bounding box */ /* UNTESTED public Rect rect() { if (this == null) return null; Rational ulx,uly,lrx,lry; Segment actSeg = (Segment)((Segment)((LinkedList)this.first()).first()).copy; actSeg.align(); ulx = actSeg.startpoint.x; uly = actSeg.startpoint.y; lrx = actSeg.endpoint.x; lry = actSeg.endpoint.y; Iterator it1 = this.iterator(); Iterator it2; while (it1.hasNext()) { it2 = ((LinkedList)it1.next()); while (it2.hasNext()) { actSeg = (Segment)it2.next(); if (actSeg.startpoint.x.less(ulx)) ulx = actSeg.startpoint.x; if (actSeg.startpoint.x.greater(lrx)) lrx = actSeg.startpoint.x; if (actSeg.endpoint.x.less(ulx)) ulx = actSeg.endpoint.x; if (actSeg.endpoint.x.greater(lrx)) lrx = actSeg.endpoint; if (actSeg.startpoint.y.less(lry)) lry = actSeg.startpoint.y; if (actSeg.startpoint.y.greater(uly)) uly = actSeg.startpoint.y; if (actSeg.endpoint.y.less(lry)) lry = actSeg.endpoint.y; if (actSeg.endpoint.y.greater(uly)) = actSeg.endpoint.y; }//while it2 }//while it1 return new Rect(ulx,uly,lrx,lry); }//end method rect UNTESTED */ }//end class CycleList