X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FPointSet.java;h=8c6642cd76ec8d21705dbcbde7f912f6eb3e17c1;hb=b6875b8bd79c804e15eb75bc64044ca2c770b07d;hp=b69edb8c5b7b32556fdb6b39fb30afdb7940a3d7;hpb=0663e0593cddd90631fe5c82b160b80f8d4e8422;p=anneal.git diff --git a/src/edu/berkeley/qfat/geom/PointSet.java b/src/edu/berkeley/qfat/geom/PointSet.java index b69edb8..8c6642c 100644 --- a/src/edu/berkeley/qfat/geom/PointSet.java +++ b/src/edu/berkeley/qfat/geom/PointSet.java @@ -1,16 +1,29 @@ package edu.berkeley.qfat.geom; import edu.wlu.cs.levy.CG.KDTree; +import java.util.*; -public class PointSet { +public class PointSet implements Iterable { private /*final*/ KDTree kd = new KDTree(3); private final double[] doubles = new double[3]; + private HashMap exact = new HashMap(); + + public Iterator iterator() { + return exact.values().iterator(); + } public void clear() { kd = new KDTree(3); } + public V get(Point p) { + return exact.get(p); + } + 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; @@ -20,6 +33,7 @@ public class PointSet { } catch (Exception e) { throw new Error(e); } + exact.put(p, v); } public void remove(HasPoint v) { remove(v.getPoint()); } @@ -30,9 +44,11 @@ public class PointSet { try { kd.delete(doubles); } catch (Exception e) { } + exact.remove(p); } public V nearest(Point p) { + if (exact.size()==0) return null; Object[] results; try { doubles[0] = p.x; @@ -44,4 +60,43 @@ public class PointSet { } 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); + } }