import edu.wlu.cs.levy.CG.KDTree;
import java.util.*;
-public class PointSet<V extends HasPoint> {
+public class PointSet<V extends HasPoint> implements Iterable<V> {
private /*final*/ KDTree kd = new KDTree(3);
private final double[] doubles = new double[3];
private HashMap<Point,V> exact = new HashMap<Point,V>();
+ public Iterator<V> 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;
}
public V nearest(Point p) {
+ if (exact.size()==0) return null;
Object[] results;
try {
doubles[0] = p.x;
}
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);
+ }
}