X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=747599c59e3ff26c47a82543d461665574ba3909;hp=5dd2aea5476024d6db522e2aa3c02d6741548eb7;hb=2f48eabf8a07e99905e1eae0b64b5a2abecb01fe;hpb=6741954c1976878336a17457936c0669ce24e594 diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 5dd2aea..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,31 +327,38 @@ public class Mesh implements Iterable { } public class BindingGroup { - private HashSet ess = new HashSet(); - public BindingGroup() { } - public BindingGroup(E e) { - ess.add(e); - } + 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 (e.bg != null) { - for(E ex : e.bg.ess) { - ex.bg = null; - add(ex); + 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 { - ess.add(e); - e.bg = this; } + } public void dobind(E e) { - for(E ex : ess) { - if (ex==e) continue; - e.p1.bind(ex.p1); - e.p2.bind(ex.p2); + for(E ebound : set) { + e.p1.bind(ebound.p2); + e.p2.bind(ebound.p1); } } public void shatter(BindingGroup bg1, BindingGroup bg2) { - for(E e : ess) { + for(E e : set) { e.shatter(e.midpoint(), bg1, bg2); } } @@ -357,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) { - e.pair.bg.add(this); - } - 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) { @@ -378,7 +391,8 @@ 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(); @@ -400,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; @@ -418,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;