X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=f9c9b945551a3f292b503ee0bc78d209e937e338;hb=725965a06dc9a59f88b36e387f07ec3600b9364b;hp=23ae1c8dac48dbd8fc502e5d42e06032b1d7af69;hpb=6e0085ca2aae0ae131abbd6d23fa5f3878834faa;p=anneal.git diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 23ae1c8..f9c9b94 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -319,32 +319,40 @@ 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 void add(E e) { - if (e.bg != null) { merge(e.bg); return; } - ess.add(e); - e.bg = this; - } - public void merge(BindingGroup bg) { - for(E e : bg.ess) { - e.bg = null; - add(e); + if (set.contains(e)) return; + for (E epeer : e.bind_peers.set) { + epeer.bind_peers = this; + set.add(epeer); } + for (E eother : e.bind_to.set) { + eother.bind_to = bind_others; + bind_others.add(eother); + } + + for(E ex : (!swap ? right : left)) { + if (e.prev.isBoundTo(ex.prev)) { + System.out.println("hit!"); + } + } + } 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) { - e.shatter(e.midpoint(), bg1, bg2); + for(E e : set) { + e.shatter(e.midpoint(), bg1, bg2, false); } } } @@ -357,18 +365,16 @@ 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(); + 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) { bind_to.add(e); } + public void dobind() { bind_to.dobind(this); } - public void bindEdge(E e) { - e.pair.bg.add(this); - } - public void dobind() { if (bg != null) bg.dobind(this); } - - public Point shatter() { return shatter(midpoint(), null, null); } - public Point shatter(Point mid, BindingGroup bg1, BindingGroup bg2) { + public Point shatter() { return shatter(midpoint(), null, null, false); } + public Point shatter(Point mid, BindingGroup bg1, BindingGroup bg2, boolean swap) { if (shattered) return mid; shattered = true; @@ -378,14 +384,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)); - //bg2.add(p2.getE(mid).pair); + bg1.add(p1.getE(mid)); + bg2.add(p2.getE(mid).pair); return mid; } @@ -400,8 +407,10 @@ 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 +427,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;