X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FPointSet.java;h=3b701180b0e6150fc25ae5d3ec50879bd2206d13;hb=a3a659d0128908676e5793c7e59884b565c367cf;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..3b70118 100644 --- a/src/edu/berkeley/qfat/geom/PointSet.java +++ b/src/edu/berkeley/qfat/geom/PointSet.java @@ -1,16 +1,28 @@ 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; Point p = v.getPoint(); doubles[0] = p.x; doubles[1] = p.y; @@ -20,6 +32,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 +43,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 +59,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); + } }