public class PointSet<V extends HasPoint> implements Iterable<V> {
+ private final RTree<V> rtree = new RTree<V>();
+
private /*final*/ KDTree kd = new KDTree(3);
private final double[] doubles = new double[3];
+ public int size() { return exact.size(); }
private HashMap<Point,V> exact = new HashMap<Point,V>();
public Iterator<V> iterator() {
}
public void clear() {
kd = new KDTree(3);
+ exact = new HashMap<Point,V>();
}
public V get(Point p) {
return exact.get(p);
}
+ public void rebuild() {
+ /*
+ HashMap<Point,V> old_exact = exact;
+ exact = new HashMap<Point,V>();
+ 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;
doubles[2] = p.z;
} catch (Exception e) {
throw new Error(e);
}
+ */
+ rtree.insert(v);
exact.put(p, v);
}
- public void remove(HasPoint v) { remove(v.getPoint()); }
- public void remove(Point p) {
+ public void remove(V v) {
+ Point p = v.getPoint();
+ /*
doubles[0] = p.x;
doubles[1] = p.y;
doubles[2] = p.z;
try {
kd.delete(doubles);
} catch (Exception e) { }
+ */
+ rtree.remove(v);
exact.remove(p);
}
public V nearest(Point p) {
if (exact.size()==0) return null;
+ /*
Object[] results;
try {
doubles[0] = p.x;
} catch (Exception e) {
throw new Error(e);
}
- return (V)results[0];
+ V kd_says = (V)results[0];
+ */
+ V rt_says = rtree.nearest(p);
+ //if (kd_says != rt_says) System.err.println("disagree: " + p + " " + kd_says + " " + rt_says);
+ return rt_says;
}