checkpoint
authoradam <adam@megacz.com>
Wed, 5 Dec 2007 04:45:30 +0000 (20:45 -0800)
committeradam <adam@megacz.com>
Wed, 5 Dec 2007 04:45:30 +0000 (20:45 -0800)
darcs-hash:20071205044530-5007d-deb34617e4c90158da4844eab6c4237475ac0af9.gz

src/edu/berkeley/qfat/Mesh.java

index cca8e47..523f6e1 100644 (file)
@@ -599,6 +599,26 @@ public class Mesh implements Iterable<Mesh.T> {
         return ret;
     }
 
         return ret;
     }
 
+    public class FaceIterator implements Iterator<T> {
+        private HashSet<T> visited = new HashSet<T>();
+        private LinkedList<T> next = new LinkedList<T>();
+        public FaceIterator(Vert v) { next.addFirst(v.e.t); }
+        public boolean hasNext() { return next.peek()!=null; }
+        public void remove() { throw new Error(); }
+        public T next() {
+            T ret = next.removeFirst();
+            if (ret == null) return null;
+            visited.add(ret);
+            T t1 = ret.e1().pair.t;
+            T t2 = ret.e2().pair.t;
+            T t3 = ret.e3().pair.t;
+            if (t1 != null && !visited.contains(t1)) next.addFirst(t1);
+            if (t2 != null && !visited.contains(t2)) next.addFirst(t2);
+            if (t3 != null && !visited.contains(t3)) next.addFirst(t3);
+            return ret;
+        }
+    }
+
     /** [UNIQUE] a triangle (face) */
     public final class T extends Triangle {
         public final E e1;
     /** [UNIQUE] a triangle (face) */
     public final class T extends Triangle {
         public final E e1;
@@ -612,10 +632,9 @@ public class Mesh implements Iterable<Mesh.T> {
             this.e1 = e1;
             E e2 = e1.next;
             E e3 = e2.next;
             this.e1 = e1;
             E e2 = e1.next;
             E e3 = e2.next;
-            if (e1==e2     || e1==e3) throw new Error();
+            if (e1==e2 || e1==e3) throw new Error();
             if (e3.next!=e1) throw new Error();
             if (e3.next!=e1) throw new Error();
-            if (e1.t!=null || e2.t!=null || e3.t!=null)
-                throw new Error("non-manifold surface or disagreeing normals");
+            if (e1.t!=null || e2.t!=null || e3.t!=null) throw new Error("non-manifold surface or disagreeing normals");
             e1.t = this;
             e1.next.t = this;
             e1.next.next.t = this;
             e1.t = this;
             e1.next.t = this;
             e1.next.next.t = this;
@@ -630,14 +649,13 @@ public class Mesh implements Iterable<Mesh.T> {
                 if (e3().pair.t != null && color == e3().pair.t.color) { color++; continue; }
                 break;
             }
                 if (e3().pair.t != null && color == e3().pair.t.color) { color++; continue; }
                 break;
             }
+            this.color = color;
 
 
-            // FIXME unnecssary
+            // FIXME unnecssary?
             ts.add(this);
             v1().kdinsert();
             v2().kdinsert();
             v3().kdinsert();
             ts.add(this);
             v1().kdinsert();
             v2().kdinsert();
             v3().kdinsert();
-
-            this.color = color;
         }
         public E e1() { return e1; }
         public E e2() { return e1.next; }
         }
         public E e1() { return e1; }
         public E e2() { return e1.next; }