checkpoint
[anneal.git] / src / edu / berkeley / qfat / Mesh.java
index c830acf..523f6e1 100644 (file)
@@ -599,6 +599,26 @@ public class Mesh implements Iterable<Mesh.T> {
         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;
@@ -608,23 +628,13 @@ public class Mesh implements Iterable<Mesh.T> {
             ts.remove(this);
         }
 
-        public Vert nearest(Point p) {
-            float d1 = v1().p.distance(p);
-            float d2 = v2().p.distance(p);
-            float d3 = v3().p.distance(p);
-            if (d1 < d2 && d1 < d3) return v1();
-            if (d2 < d3) return v2();
-            return v3();
-        }
-
         T(E e1) {
             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 (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;
@@ -639,45 +649,25 @@ public class Mesh implements Iterable<Mesh.T> {
                 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();
-
-            this.color = color;
         }
+        public E e1() { return e1; }
+        public E e2() { return e1.next; }
+        public E e3() { return e1.prev; }
         public Vert v1() { return e1.p1; }
         public Vert v2() { return e1.p2; }
         public Vert v3() { return e1.next.p2; }
         public Point p1() { return e1.p1.p; }
         public Point p2() { return e1.p2.p; }
         public Point p3() { return e1.next.p2.p; }
-        public E e1() { return e1; }
-        public E e2() { return e1.next; }
-        public E e3() { return e1.prev; }
-        public Vec norm() { return v2().p.minus(v1().p).cross(v3().p.minus(v1().p)).norm(); }
         public boolean hasE(E e) { return e1==e || e1.next==e || e1.prev==e; }
         public boolean has(Vert v) { return v1()==v || v2()==v || v3()==v; }
-        public float area() { return (float)Math.abs(0.5*e1().length()*new Vec(v1().p, v2().p).norm().dot(new Vec(v2().p, v3().p))); }
-        public void glVertices(GL gl) {
-            v1().p.glVertex(gl);
-            v2().p.glVertex(gl);
-            v3().p.glVertex(gl);
-        }
-
-        public Point centroid() {
-            return new Point((v1().p.x+v2().p.x+v3().p.x)/3,
-                             (v1().p.y+v2().p.y+v3().p.y)/3, 
-                             (v1().p.z+v2().p.z+v3().p.z)/3); }
-        public float diameter() {
-            // FIXME: what is this supposed to be?
-            return Math.max(Math.max(e1().length(), e2().length()), e3().length()) / 2;
-        }
-
-
     }
-    
 
 }