checkpoint
[anneal.git] / src / edu / berkeley / qfat / Mesh.java
index c00458c..1579551 100644 (file)
@@ -16,7 +16,6 @@ public class Mesh implements Iterable<Mesh.T> {
 
     private PointSet<Vert> pointset = new PointSet<Vert>();
     public Vert nearest(Point p) { return pointset.nearest(p); }
-    private HashMap<Point,Vert> verts = new HashMap<Point,Vert>();
 
     public Iterable<E> edges() {
         return
@@ -97,43 +96,8 @@ public class Mesh implements Iterable<Mesh.T> {
         for(Vert v : set) v.transform(m);
     }
 
-    public Vec diagonal() {
-        float min_x = Float.MAX_VALUE;
-        float min_y = Float.MAX_VALUE;
-        float min_z = Float.MAX_VALUE;
-        float max_x = Float.MIN_VALUE;
-        float max_y = Float.MIN_VALUE;
-        float max_z = Float.MIN_VALUE;
-        for(Point p : verts.keySet()) {
-            if (p.x < min_x) min_x = p.x;
-            if (p.y < min_y) min_y = p.y;
-            if (p.z < min_z) min_z = p.z;
-            if (p.x > max_x) max_x = p.x;
-            if (p.y > max_y) max_y = p.y;
-            if (p.z > max_z) max_z = p.z;
-        }
-        return new Vec(max_x - min_x, max_y - min_y, max_z - min_z);
-    }
-
-    public Point centroid() {
-        float min_x = Float.MAX_VALUE;
-        float min_y = Float.MAX_VALUE;
-        float min_z = Float.MAX_VALUE;
-        float max_x = Float.MIN_VALUE;
-        float max_y = Float.MIN_VALUE;
-        float max_z = Float.MIN_VALUE;
-        for(Point p : verts.keySet()) {
-            if (p.x < min_x) min_x = p.x;
-            if (p.y < min_y) min_y = p.y;
-            if (p.z < min_z) min_z = p.z;
-            if (p.x > max_x) max_x = p.x;
-            if (p.y > max_y) max_y = p.y;
-            if (p.z > max_z) max_z = p.z;
-        }
-        return new Point((float)(max_x + min_x)/2,
-                     (float)(max_y + min_y)/2,
-                     (float)(max_z + min_z)/2);
-    }
+    public Vec diagonal() { return pointset.diagonal(); }
+    public Point centroid() { return pointset.centroid(); }
 
     public float volume() {
         double total = 0;
@@ -167,14 +131,13 @@ public class Mesh implements Iterable<Mesh.T> {
         }
     }
 
-    public Vert register(Point p) { Vert v = verts.get(p); return v==null ? new Vert(p) : v; }
+    public Vert register(Point p) { Vert v = pointset.get(p); return v==null ? new Vert(p) : v; }
     public final class Vert extends HasPoint {
         public Point p;
         public Point getPoint() { return p; }
         private Vert(Point p) {
             this.p = p;
-            if (verts.get(p) != null) throw new Error();
-            verts.put(this.p, this);
+            if (pointset.get(p) != null) throw new Error();
             pointset.add(this);
         }
         public void reinsert() {
@@ -245,8 +208,7 @@ public class Mesh implements Iterable<Mesh.T> {
             // FIXME: screws up hashmap
             unscore();
             try {
-                if (verts.get(this.p)==null) throw new Error();
-                verts.remove(this.p);
+                if (pointset.get(this.p)==null) throw new Error();
                 pointset.remove(this);
                 float newx = m.a*p.x + m.b*p.y + m.c*p.z + m.d;
                 float newy = m.e*p.x + m.f*p.y + m.g*p.z + m.h;
@@ -254,7 +216,6 @@ public class Mesh implements Iterable<Mesh.T> {
                 this.p = new Point(newx, newy, newz);
                 // FIXME: what if we move onto exactly where another point is?
                 pointset.add(this);
-                verts.put(this.p,(Vert)this);
             } catch (Exception e) {
                 throw new RuntimeException(e);
             }