X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=747599c59e3ff26c47a82543d461665574ba3909;hp=8a697dc1ec39f6c9d47d4b7bb6d8b57395c01fa1;hb=2f48eabf8a07e99905e1eae0b64b5a2abecb01fe;hpb=982c27e513b15799973ab26d5dc143aa4606800a diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 8a697dc..747599c 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -239,9 +239,17 @@ public class Mesh implements Iterable { e = e.pair.next; } while(e != this.e); - // FIXME: intersection test needed? - return true; + boolean good = true; + for(T t : Mesh.this) { + if (!good) break; + e = this.e; + do { + if (!t.has(e.p1) && !t.has(e.p2) && e.t != null && e.intersects(t)) { good = false; break; } + e = e.pair.next; + } while(e != this.e); + } + return good; } public boolean move(Vec v) { @@ -319,52 +327,40 @@ public class Mesh implements Iterable { } public class BindingGroup { - private HashSet left = new HashSet(); - private HashSet right = new HashSet(); - public BindingGroup() { } - public BindingGroup(E e) { - left.add(e); - } - public void add(E e, boolean swap) { - if (e.bg != null) { - if (e.bg == this) return; - for(E ex : (!swap ? e.bg.left : e.bg.right)) { - ex.bg = this; - left.add(ex); - } - for(E ex : (!swap ? e.bg.right : e.bg.left)) { - ex.bg = this; - right.add(ex); + private HashSet set = new HashSet(); + public BindingGroup bind_others; + public BindingGroup other() { return bind_others; } + public BindingGroup(BindingGroup bind_others) { this.bind_others = bind_others; } + public BindingGroup() { this.bind_others = new BindingGroup(this); } + public BindingGroup(E e) { this(); set.add(e); } + public void add(E e) { + if (set.contains(e)) return; + for (E epeer : e.bind_peers.set) { + epeer.bind_peers = this; + epeer.bind_to = bind_others; + set.add(epeer); + } + for (E eother : e.bind_to.set) { + bind_others.add(eother); + } + + for(E eother : bind_others.set) { + if (e.next.bind_to.set.contains(eother.prev)) { + e.next.next.bindEdge(eother.prev.prev); } - } else { - (!swap ? left : right).add(e); - e.bg = this; } + } public void dobind(E e) { - // assumes e is part of the "left" set - Vert v1 = null; - Vert v2 = null; - if (left.contains(e)) { v1 = e.p1; v2 = e.p2; } - if (right.contains(e)) { v1 = e.p2; v2 = e.p1; } - for(E ex : left) { - if (ex==e) continue; - v1.bind(ex.p1); - v2.bind(ex.p2); - } - for(E ex : right) { - if (ex==e) continue; - v1.bind(ex.p2); - v2.bind(ex.p1); + for(E ebound : set) { + e.p1.bind(ebound.p2); + e.p2.bind(ebound.p1); } } public void shatter(BindingGroup bg1, BindingGroup bg2) { - for(E e : left) { + for(E e : set) { e.shatter(e.midpoint(), bg1, bg2); } - for(E e : right) { - e.shatter(e.midpoint(), bg2, bg1); /* swap correct? */ - } } } @@ -376,15 +372,13 @@ public class Mesh implements Iterable { E prev; // previous half-edge E next; // next half-edge E pair; // partner half-edge - public BindingGroup bg = new BindingGroup(this); + public BindingGroup bind_peers = new BindingGroup(this); + public BindingGroup bind_to = bind_peers.other(); boolean shattered = false; public int compareTo(E e) { return e.length() > length() ? 1 : -1; } - - public void bindEdge(E e) { - bg.add(e.pair, false); - } - public void dobind() { if (bg != null) bg.dobind(this); } + public void bindEdge(E e) { bind_to.add(e); } + public void dobind() { bind_to.dobind(this); } public Point shatter() { return shatter(midpoint(), null, null); } public Point shatter(Point mid, BindingGroup bg1, BindingGroup bg2) { @@ -397,14 +391,15 @@ public class Mesh implements Iterable { if (bg1==null) bg1 = new BindingGroup(); if (bg2==null) bg2 = new BindingGroup(); - bg.shatter(bg1, bg2); + bind_peers.shatter(bg1, bg2); + bind_to.shatter(bg2.other(), bg1.other()); pair.shatter(); destroy(); newT(r.p, p1.p, mid, null); newT(r.p, mid, p2.p, null); - bg1.add(p1.getE(mid), false); - bg2.add(p2.getE(mid).pair, false); + bg1.add(p1.getE(mid)); + bg2.add(p2.getE(mid).pair); return mid; } @@ -419,8 +414,12 @@ public class Mesh implements Iterable { prev.t = null; pair.next.t = null; pair.prev.t = null; - this.bg = null; - pair.bg = null; + /* + this.bind_to = null; + pair.bind_to = null; + this.bind_peers = null; + pair.bind_peers = null; + */ pair.prev.next = next; next.prev = pair.prev; prev.next = pair.next; @@ -437,6 +436,7 @@ public class Mesh implements Iterable { this.prev.next = this; this.next.prev = this; this.pair.pair = this; + bind_peers.add(this); if (this.next.p1 != p2) throw new Error(); if (this.prev.p2 != p1) throw new Error(); if (this.p1.e == null) this.p1.e = this;