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();
12 private int lowid = 0;
13 private HashMap<Integer, V> idToV = new HashMap<Integer, V>();
14 private HashMap<V, Integer> vToId = new HashMap<V, Integer>();
16 public Iterator<V> iterator() { return vToId.keySet().iterator(); }
18 private final MyIntProcedure myIntProcedure = new MyIntProcedure();
19 private final com.infomatiq.jsi.Rectangle rect = new com.infomatiq.jsi.Rectangle(0,0,0,0,0,0);
20 private final com.infomatiq.jsi.Point point = new com.infomatiq.jsi.Point(0,0,0);
21 private V found = null;
22 private Visitor<V> visitor = null;
24 private static final Properties props = new Properties();
26 props.put("MinNodeEntries", "1");
27 props.put("MaxNodeEntries", "5");
30 public RTree() { clear(); }
38 public void add(V v) { insert(v); }
39 public void insert(V v) {
43 rect.set(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
47 public void remove(V v) {
48 Integer idi = vToId.get(v);
49 if (idi==null) return;
53 rect.set(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
54 rtree.delete(rect, id);
57 private class MyIntProcedure implements IntProcedure {
58 public boolean execute(int id) {
59 if (visitor != null) {
64 found = idToV.get(id);
70 public V nearest(Point p) {
71 point.set(p.x, p.y, p.z);
72 rtree.nearest(point, myIntProcedure, Float.POSITIVE_INFINITY);
78 public void range(HasBoundingBox v, Visitor vis) {
80 rtree.intersects(rect, myIntProcedure);