X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fedu%2Fberkeley%2Fqfat%2FMesh.java;h=2441057da4bdc47fb1ffb0f78ea0aecca1960868;hb=d461f6cdb421755dde0d0bee4738d31acc116e4d;hp=02188f22f9ec7f9c1cab7c1e5e89f5f712d702f6;hpb=fd66f9cae9e63d2c1dbbdcd020c6fb97839278cc;p=anneal.git diff --git a/src/edu/berkeley/qfat/Mesh.java b/src/edu/berkeley/qfat/Mesh.java index 02188f2..2441057 100644 --- a/src/edu/berkeley/qfat/Mesh.java +++ b/src/edu/berkeley/qfat/Mesh.java @@ -239,7 +239,6 @@ public class Mesh implements Iterable { e = e.pair.next; } while(e != this.e); - // FIXME: intersection test needed? return true; } @@ -319,60 +318,39 @@ public class Mesh implements Iterable { } public class BindingGroup { - private HashSet left = new HashSet(); - private HashSet right = new HashSet(); - public BindingGroup() { } - public BindingGroup(E e) { add(e, false); } - public void add(E e, boolean swap) { - if (e.bg != null) { - if (e.bg == this) return; /* fixme what if it is in the "other" set? */ - 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); - } - - } else { - (!swap ? left : right).add(e); - e.bg = this; + 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 ex : (!swap ? right : left)) { - if (e.next.isBoundTo(ex.next)) { - System.out.println("hit!"); + for(E eother : bind_others.set) { + if (e.next.bind_to.set.contains(eother.prev)) { + e.next.next.bindEdge(eother.prev.prev); } } - } - public boolean isBoundTo(E e1, E e2) { - if (left.contains(e1) && right.contains(e2)) return true; - if (left.contains(e2) && right.contains(e1)) return true; - return false; + } public void dobind(E e) { - 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) { - e.shatter(e.midpoint(), bg1, bg2, false); - } - for(E e : right) { - e.shatter(e.midpoint(), bg1, bg2, true); // swap correct? + for(E e : set) { + e.shatter(e.midpoint(), bg1, bg2); } } } @@ -385,21 +363,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(this); + public BindingGroup bind_to = bind_peers.other(); boolean shattered = false; - public boolean isBoundTo(E e) { return bg.isBoundTo(this, e); } - - 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) { - bg.add(e, true); - } - public void dobind() { if (bg != null) bg.dobind(this); } - - public Point shatter() { return shatter(midpoint(), null, null, false); } - public Point shatter(Point mid, BindingGroup bg1, BindingGroup bg2, boolean swap) { + public Point shatter() { return shatter(midpoint(), null, null); } + public Point shatter(Point mid, BindingGroup bg1, BindingGroup bg2) { if (shattered) return mid; shattered = true; @@ -409,14 +382,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); - (swap ? bg1 : bg2).add(p1.getE(mid), swap); - (swap ? bg2 : bg1).add(p2.getE(mid).pair, swap); + bg1.add(p1.getE(mid)); + bg2.add(p2.getE(mid).pair); return mid; } @@ -431,8 +405,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; @@ -449,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;