1 package edu.berkeley.qfat.geom;
4 /** a set of points, plus many useful methods operating over the set */
5 public class PointSet<V extends HasPoint> implements Iterable<V> {
7 private RTree<V> rtree = new RTree<V>();
9 private HashMap<Point,V> exact = new HashMap<Point,V>();
11 public int size() { return exact.size(); }
13 public Iterator<V> iterator() { return rtree.iterator(); }
17 rtree = new RTree<V>();
20 public V get(Point p) {
24 public void add(V v) {
25 V x = get(v.getPoint());
26 if (x != null && x.equals(v)) return;
27 if (x != null) throw new Error("duplicates!");
28 Point p = v.getPoint();
33 public void remove(V v) {
34 Point p = v.getPoint();
39 public V nearest(Point p) { return nearest(p, null); }
40 public V nearest(Point p, Visitor<V> vis) {
41 if (exact.size()==0) return null;
42 return rtree.nearest(p, vis);
45 // FEATURE: compute incrementally?
46 public Vec diagonal() {
47 float min_x = Float.MAX_VALUE;
48 float min_y = Float.MAX_VALUE;
49 float min_z = Float.MAX_VALUE;
50 float max_x = Float.MIN_VALUE;
51 float max_y = Float.MIN_VALUE;
52 float max_z = Float.MIN_VALUE;
54 Point p = v.getPoint();
55 if (p.x < min_x) min_x = p.x;
56 if (p.y < min_y) min_y = p.y;
57 if (p.z < min_z) min_z = p.z;
58 if (p.x > max_x) max_x = p.x;
59 if (p.y > max_y) max_y = p.y;
60 if (p.z > max_z) max_z = p.z;
62 return new Vec(max_x - min_x, max_y - min_y, max_z - min_z);
65 // FEATURE: compute incrementally?
66 public Point centroid() {
67 float min_x = Float.MAX_VALUE;
68 float min_y = Float.MAX_VALUE;
69 float min_z = Float.MAX_VALUE;
70 float max_x = Float.MIN_VALUE;
71 float max_y = Float.MIN_VALUE;
72 float max_z = Float.MIN_VALUE;
74 Point p = v.getPoint();
75 if (p.x < min_x) min_x = p.x;
76 if (p.y < min_y) min_y = p.y;
77 if (p.z < min_z) min_z = p.z;
78 if (p.x > max_x) max_x = p.x;
79 if (p.y > max_y) max_y = p.y;
80 if (p.z > max_z) max_z = p.z;
82 return new Point((float)(max_x + min_x)/2,
83 (float)(max_y + min_y)/2,
84 (float)(max_z + min_z)/2);