checkpoint
[anneal.git] / src / edu / berkeley / qfat / Mesh.java
index f9c9b94..747599c 100644 (file)
@@ -239,9 +239,17 @@ public class Mesh implements Iterable<Mesh.T> {
                 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) {
@@ -323,23 +331,22 @@ public class Mesh implements Iterable<Mesh.T> {
         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() { 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) {
-                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!");
+            for(E eother : bind_others.set) {
+                if (e.next.bind_to.set.contains(eother.prev)) {
+                    e.next.next.bindEdge(eother.prev.prev);
                 }
             }
 
@@ -352,7 +359,7 @@ public class Mesh implements Iterable<Mesh.T> {
         }
         public void shatter(BindingGroup bg1, BindingGroup bg2) {
             for(E e : set) {
-                e.shatter(e.midpoint(), bg1, bg2, false);
+                e.shatter(e.midpoint(), bg1, bg2);
             }
         }
     }
@@ -365,7 +372,7 @@ public class Mesh implements Iterable<Mesh.T> {
         E prev;  // previous half-edge
         E next;  // next half-edge
         E pair;  // partner half-edge
-        public BindingGroup bind_peers  = new BindingGroup();
+        public BindingGroup bind_peers  = new BindingGroup(this);
         public BindingGroup bind_to     = bind_peers.other();
         boolean shattered = false;
 
@@ -373,8 +380,8 @@ public class Mesh implements Iterable<Mesh.T> {
         public void bindEdge(E e) { bind_to.add(e); }
         public void dobind() { bind_to.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;
 
@@ -407,10 +414,12 @@ public class Mesh implements Iterable<Mesh.T> {
             prev.t = null;
             pair.next.t = null;
             pair.prev.t = 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;