checkpoint
[anneal.git] / src / edu / berkeley / qfat / geom / RTree.java
index 48fade2..eaa9f69 100644 (file)
@@ -4,7 +4,7 @@ import java.util.*;
 import com.infomatiq.jsi.*;
 import com.infomatiq.jsi.rtree.*;
 
-public class RTree<V extends HasBoundingBox> {
+public class RTree<V extends HasBoundingBox> implements Iterable<V> {
 
     private com.infomatiq.jsi.rtree.RTree rtree =
         new com.infomatiq.jsi.rtree.RTree();
@@ -13,6 +13,8 @@ public class RTree<V extends HasBoundingBox> {
     HashMap<Integer, V> idToV = new HashMap<Integer, V>();
     HashMap<V, Integer> vToId = new HashMap<V, Integer>();
 
+    public Iterator<V> iterator() { return vToId.keySet().iterator(); }
+
     public RTree() {
         Properties props = new Properties();
         props.put("MinNodeEntries", "1");
@@ -20,6 +22,7 @@ public class RTree<V extends HasBoundingBox> {
         rtree.init(props);
     }
 
+    public void add(V v) { insert(v); }
     public void insert(V v) {
         int id = lowid++;
         idToV.put(id, v);
@@ -30,7 +33,9 @@ public class RTree<V extends HasBoundingBox> {
     }
 
     public void remove(V v) {
-        int id = vToId.get(v);
+        Integer idi = vToId.get(v);
+        if (idi==null) return;
+        int id = idi;
         idToV.remove(id);
         vToId.remove(v);
         rtree.delete(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(),
@@ -38,9 +43,8 @@ public class RTree<V extends HasBoundingBox> {
                      id);
     }
 
-
+    // gross...
     V found = null;
-
     private IntProcedure finder = new IntProcedure() {
             public boolean execute(int id) {
                 found = idToV.get(id);
@@ -54,4 +58,21 @@ public class RTree<V extends HasBoundingBox> {
         found = null;
         return ret;
     }
+
+    Visitor<V> visitor = null;
+    private IntProcedure searcher = new IntProcedure() {
+            public boolean execute(int id) {
+                V v = idToV.get(id);
+                visitor.visit(v);
+                return true;
+            }
+        };
+    public void range(HasBoundingBox v, Visitor vis) {
+        visitor = vis;
+        rtree.intersects(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(),
+                                                         v.getMaxX(), v.getMaxY(), v.getMaxZ()),
+                         searcher);
+        visitor = null;
+    }
+
 }