add RTree classes
[anneal.git] / src / edu / berkeley / qfat / geom / PointSet.java
1 package edu.berkeley.qfat.geom;
2 import edu.wlu.cs.levy.CG.KDTree;
3 import java.util.*;
4
5 public class PointSet<V extends HasPoint> implements Iterable<V> {
6
7     private final RTree<V> rtree = new RTree<V>();
8
9     private /*final*/ KDTree kd = new KDTree(3);
10     private final double[] doubles = new double[3];
11
12     public int size() { return exact.size(); }
13     private HashMap<Point,V> exact = new HashMap<Point,V>();
14
15     public Iterator<V> iterator() {
16         return exact.values().iterator();
17     }
18     public void clear() {
19         kd = new KDTree(3);
20         exact = new HashMap<Point,V>();
21     }
22
23     public V get(Point p) {
24         return exact.get(p);
25     }
26
27     public void rebuild() {
28         /*
29         HashMap<Point,V> old_exact = exact;
30         exact = new HashMap<Point,V>();
31         kd = new KDTree(3);
32         for(V v : old_exact.values()) add(v);
33         */
34     }
35
36     public void add(V v) {
37         V x = get(v.getPoint());
38         if (x != null && x.equals(v)) return;
39         if (x != null) throw new Error("duplicates!");
40         Point p = v.getPoint();
41         /*
42         doubles[0] = p.x;
43         doubles[1] = p.y;
44         doubles[2] = p.z;
45         try {
46             kd.insert(doubles, v);
47         } catch (Exception e) {
48             throw new Error(e);
49         }
50         */
51         rtree.insert(v);
52         exact.put(p, v);
53     }
54
55     public void remove(V v) {
56         Point p = v.getPoint();
57         /*
58         doubles[0] = p.x;
59         doubles[1] = p.y;
60         doubles[2] = p.z;
61         try {
62             kd.delete(doubles);
63         } catch (Exception e) { }
64         */
65         rtree.remove(v);
66         exact.remove(p);
67     }
68
69     public V nearest(Point p) {
70         if (exact.size()==0) return null;
71         /*
72         Object[] results;
73         try {
74             doubles[0] = p.x;
75             doubles[1] = p.y;
76             doubles[2] = p.z;
77             results = kd.nearest(doubles,1);
78         } catch (Exception e) {
79             throw new Error(e);
80         }
81         V kd_says = (V)results[0];
82         */
83         V rt_says = rtree.nearest(p);
84         //if (kd_says != rt_says) System.err.println("disagree: " + p + " " + kd_says + " " + rt_says);
85         return rt_says;
86     }
87
88
89     public Vec diagonal() {
90         float min_x = Float.MAX_VALUE;
91         float min_y = Float.MAX_VALUE;
92         float min_z = Float.MAX_VALUE;
93         float max_x = Float.MIN_VALUE;
94         float max_y = Float.MIN_VALUE;
95         float max_z = Float.MIN_VALUE;
96         for(Point p : exact.keySet()) {
97             if (p.x < min_x) min_x = p.x;
98             if (p.y < min_y) min_y = p.y;
99             if (p.z < min_z) min_z = p.z;
100             if (p.x > max_x) max_x = p.x;
101             if (p.y > max_y) max_y = p.y;
102             if (p.z > max_z) max_z = p.z;
103         }
104         return new Vec(max_x - min_x, max_y - min_y, max_z - min_z);
105     }
106
107     public Point centroid() {
108         float min_x = Float.MAX_VALUE;
109         float min_y = Float.MAX_VALUE;
110         float min_z = Float.MAX_VALUE;
111         float max_x = Float.MIN_VALUE;
112         float max_y = Float.MIN_VALUE;
113         float max_z = Float.MIN_VALUE;
114         for(Point p : exact.keySet()) {
115             if (p.x < min_x) min_x = p.x;
116             if (p.y < min_y) min_y = p.y;
117             if (p.z < min_z) min_z = p.z;
118             if (p.x > max_x) max_x = p.x;
119             if (p.y > max_y) max_y = p.y;
120             if (p.z > max_z) max_z = p.z;
121         }
122         return new Point((float)(max_x + min_x)/2,
123                      (float)(max_y + min_y)/2,
124                      (float)(max_z + min_z)/2);
125     }
126 }