checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / PointSet.java
index 841d781..cd3edb7 100644 (file)
@@ -7,6 +7,7 @@ public class PointSet<V extends HasPoint> implements Iterable<V> {
     private /*final*/ KDTree kd = new KDTree(3);
     private final double[] doubles = new double[3];
 
+    public int size() { return exact.size(); }
     private HashMap<Point,V> exact = new HashMap<Point,V>();
 
     public Iterator<V> iterator() {
@@ -14,15 +15,24 @@ public class PointSet<V extends HasPoint> implements Iterable<V> {
     }
     public void clear() {
         kd = new KDTree(3);
+        exact = new HashMap<Point,V>();
     }
 
     public V get(Point p) {
         return exact.get(p);
     }
 
+    public void rebuild() {
+        HashMap<Point,V> old_exact = exact;
+        exact = new HashMap<Point,V>();
+        kd = new KDTree(3);
+        for(V v : old_exact.values()) add(v);
+    }
+
     public void add(V v) {
         V x = get(v.getPoint());
         if (x != null && x.equals(v)) return;
+        if (x != null) throw new Error("duplicates!");
         Point p = v.getPoint();
         doubles[0] = p.x;
         doubles[1] = p.y;
@@ -59,4 +69,43 @@ public class PointSet<V extends HasPoint> implements Iterable<V> {
         }
         return (V)results[0];
     }
+
+
+    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 : exact.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 : exact.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);
+    }
 }