X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FPointSet.java;h=cd3edb73d8b08133e8ccd7f4bacf5438808e7da6;hb=57376a862c00fa1c8731f9989085fcfceeee0370;hp=f47a8d5878c8a6df550f6fcb5c03246c3cf8898c;hpb=22da29ec26d486c1d396bdbe4971994b17987504;p=anneal.git diff --git a/src/edu/berkeley/qfat/geom/PointSet.java b/src/edu/berkeley/qfat/geom/PointSet.java index f47a8d5..cd3edb7 100644 --- a/src/edu/berkeley/qfat/geom/PointSet.java +++ b/src/edu/berkeley/qfat/geom/PointSet.java @@ -2,18 +2,37 @@ 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]; + public int size() { return exact.size(); } private HashMap exact = new HashMap(); + public Iterator iterator() { + return exact.values().iterator(); + } public void clear() { kd = new KDTree(3); + exact = new HashMap(); + } + + public V get(Point p) { + return exact.get(p); + } + + public void rebuild() { + HashMap old_exact = exact; + exact = new HashMap(); + 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; @@ -38,6 +57,7 @@ public class PointSet { } public V nearest(Point p) { + if (exact.size()==0) return null; Object[] results; try { doubles[0] = p.x; @@ -49,4 +69,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); + } }