checkpoint
[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*/ KDTree kd = new KDTree(3);
8     private final double[] doubles = new double[3];
9
10     private HashMap<Point,V> exact = new HashMap<Point,V>();
11
12     public Iterator<V> iterator() {
13         return exact.values().iterator();
14     }
15     public void clear() {
16         kd = new KDTree(3);
17     }
18
19     public V get(Point p) {
20         return exact.get(p);
21     }
22
23     public void add(V v) {
24         V x = get(v.getPoint());
25         if (x != null && x.equals(v)) return;
26         Point p = v.getPoint();
27         doubles[0] = p.x;
28         doubles[1] = p.y;
29         doubles[2] = p.z;
30         try {
31             kd.insert(doubles, v);
32         } catch (Exception e) {
33             throw new Error(e);
34         }
35         exact.put(p, v);
36     }
37
38     public void remove(HasPoint v) { remove(v.getPoint()); }
39     public void remove(Point p) {
40         doubles[0] = p.x;
41         doubles[1] = p.y;
42         doubles[2] = p.z;
43         try {
44             kd.delete(doubles);
45         } catch (Exception e) { }
46         exact.remove(p);
47     }
48
49     public V nearest(Point p) {
50         if (exact.size()==0) return null;
51         Object[] results;
52         try {
53             doubles[0] = p.x;
54             doubles[1] = p.y;
55             doubles[2] = p.z;
56             results = kd.nearest(doubles,1);
57         } catch (Exception e) {
58             throw new Error(e);
59         }
60         return (V)results[0];
61     }
62 }