1 package edu.berkeley.qfat.geom;
2 import edu.wlu.cs.levy.CG.KDTree;
5 public class PointSet<V extends HasPoint> implements Iterable<V> {
7 private /*final*/ KDTree kd = new KDTree(3);
8 private final double[] doubles = new double[3];
10 public int size() { return exact.size(); }
11 private HashMap<Point,V> exact = new HashMap<Point,V>();
13 public Iterator<V> iterator() {
14 return exact.values().iterator();
18 exact = new HashMap<Point,V>();
21 public V get(Point p) {
25 public void rebuild() {
26 HashMap<Point,V> old_exact = exact;
27 exact = new HashMap<Point,V>();
29 for(V v : old_exact.values()) add(v);
32 public void add(V v) {
33 V x = get(v.getPoint());
34 if (x != null && x.equals(v)) return;
35 if (x != null) throw new Error("duplicates!");
36 Point p = v.getPoint();
41 kd.insert(doubles, v);
42 } catch (Exception e) {
48 public void remove(HasPoint v) { remove(v.getPoint()); }
49 public void remove(Point p) {
55 } catch (Exception e) { }
59 public V nearest(Point p) {
60 if (exact.size()==0) return null;
66 results = kd.nearest(doubles,1);
67 } catch (Exception e) {
74 public Vec diagonal() {
75 float min_x = Float.MAX_VALUE;
76 float min_y = Float.MAX_VALUE;
77 float min_z = Float.MAX_VALUE;
78 float max_x = Float.MIN_VALUE;
79 float max_y = Float.MIN_VALUE;
80 float max_z = Float.MIN_VALUE;
81 for(Point p : exact.keySet()) {
82 if (p.x < min_x) min_x = p.x;
83 if (p.y < min_y) min_y = p.y;
84 if (p.z < min_z) min_z = p.z;
85 if (p.x > max_x) max_x = p.x;
86 if (p.y > max_y) max_y = p.y;
87 if (p.z > max_z) max_z = p.z;
89 return new Vec(max_x - min_x, max_y - min_y, max_z - min_z);
92 public Point centroid() {
93 float min_x = Float.MAX_VALUE;
94 float min_y = Float.MAX_VALUE;
95 float min_z = Float.MAX_VALUE;
96 float max_x = Float.MIN_VALUE;
97 float max_y = Float.MIN_VALUE;
98 float max_z = Float.MIN_VALUE;
99 for(Point p : exact.keySet()) {
100 if (p.x < min_x) min_x = p.x;
101 if (p.y < min_y) min_y = p.y;
102 if (p.z < min_z) min_z = p.z;
103 if (p.x > max_x) max_x = p.x;
104 if (p.y > max_y) max_y = p.y;
105 if (p.z > max_z) max_z = p.z;
107 return new Point((float)(max_x + min_x)/2,
108 (float)(max_y + min_y)/2,
109 (float)(max_z + min_z)/2);