1 package edu.berkeley.qfat.geom;
2 import javax.media.opengl.*;
4 import com.infomatiq.jsi.*;
5 import com.infomatiq.jsi.rtree.*;
7 public class RTree<V extends HasBoundingBox> implements Iterable<V> {
9 private com.infomatiq.jsi.rtree.RTree rtree =
10 new com.infomatiq.jsi.rtree.RTree();
13 HashMap<Integer, V> idToV = new HashMap<Integer, V>();
14 HashMap<V, Integer> vToId = new HashMap<V, Integer>();
16 public Iterator<V> iterator() { return vToId.keySet().iterator(); }
18 private static final Properties props = new Properties();
20 props.put("MinNodeEntries", "1");
21 props.put("MaxNodeEntries", "5");
24 public RTree() { clear(); }
32 public void add(V v) { insert(v); }
33 public void insert(V v) {
37 rtree.add(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(),
38 v.getMaxX(), v.getMaxY(), v.getMaxZ()),
42 public void remove(V v) {
43 Integer idi = vToId.get(v);
44 if (idi==null) return;
48 rtree.delete(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(),
49 v.getMaxX(), v.getMaxY(), v.getMaxZ()),
55 private IntProcedure finder = new IntProcedure() {
56 public boolean execute(int id) {
57 found = idToV.get(id);
62 public V nearest(Point p) {
63 rtree.nearest(new com.infomatiq.jsi.Point(p.x, p.y, p.z), finder, Float.POSITIVE_INFINITY);
69 Visitor<V> visitor = null;
70 private IntProcedure searcher = new IntProcedure() {
71 public boolean execute(int id) {
77 public void range(HasBoundingBox v, Visitor vis) {
79 rtree.intersects(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(),
80 v.getMaxX(), v.getMaxY(), v.getMaxZ()),