X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=523f6e128e28d5b398d071425a842e8ac90fc9ac;hp=aa2e9211b17950b7f47b99089adc10ba57cf52e2;hb=9cb29008e66ab67e91e86cce89732157883ab488;hpb=f569231a23ceb2881c9720a8e8711c7aaaed05d4;ds=sidebyside diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index aa2e921..523f6e1 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -599,6 +599,26 @@ public class Mesh implements Iterable { return ret; } + public class FaceIterator implements Iterator { + private HashSet visited = new HashSet(); + private LinkedList next = new LinkedList(); + 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 { 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,30 +649,25 @@ public class Mesh implements Iterable { 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 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; } - - - } - }