checkpoint
authoradam <adam@megacz.com>
Sun, 16 Dec 2007 01:27:58 +0000 (17:27 -0800)
committeradam <adam@megacz.com>
Sun, 16 Dec 2007 01:27:58 +0000 (17:27 -0800)
darcs-hash:20071216012758-5007d-166fa72d432252c378f9ee5ec9df268dda1be75e.gz

src/com/infomatiq/jsi/Point.java
src/edu/berkeley/qfat/geom/RTree.java

index c608971..0134c73 100644 (file)
@@ -48,4 +48,10 @@ public class Point {
     coordinates[1] = y;
     coordinates[2] = z;
   }
+
+    public void set(float x, float y, float z) {
+    coordinates[0] = x; 
+    coordinates[1] = y;
+    coordinates[2] = z;
+    }
 }
index b9078e1..2fab5f5 100644 (file)
@@ -15,6 +15,12 @@ public class RTree<V extends HasBoundingBox> implements Iterable<V> {
 
     public Iterator<V> iterator() { return vToId.keySet().iterator(); }
 
+    private final MyIntProcedure myIntProcedure = new MyIntProcedure();
+    private final com.infomatiq.jsi.Rectangle rect = new com.infomatiq.jsi.Rectangle(0,0,0,0,0,0);
+    private final com.infomatiq.jsi.Point point = new com.infomatiq.jsi.Point(0,0,0);
+    private V found = null;
+    private Visitor<V> visitor = null;
+
     private static final Properties props = new Properties();
     static {
         props.put("MinNodeEntries", "1");
@@ -38,7 +44,6 @@ public class RTree<V extends HasBoundingBox> implements Iterable<V> {
         rtree.add(rect, id);
     }
 
-    private com.infomatiq.jsi.Rectangle rect = new com.infomatiq.jsi.Rectangle(0,0,0,0,0,0);
     public void remove(V v) {
         Integer idi = vToId.get(v);
         if (idi==null) return;
@@ -49,35 +54,30 @@ public class RTree<V extends HasBoundingBox> implements Iterable<V> {
         rtree.delete(rect, id);
     }
 
-    // gross...
-    V found = null;
-    private IntProcedure finder = new IntProcedure() {
-            public boolean execute(int id) {
+    private class MyIntProcedure implements IntProcedure {
+        public boolean execute(int id) {
+            if (visitor != null) {
+                V v = idToV.get(id);
+                visitor.visit(v);
+                return true;
+            } else {
                 found = idToV.get(id);
                 return false;
             }
-        };
+        }
+    }
 
     public V nearest(Point p) {
-        rtree.nearest(new com.infomatiq.jsi.Point(p.x, p.y, p.z), finder, Float.POSITIVE_INFINITY);
+        point.set(p.x, p.y, p.z);
+        rtree.nearest(point, myIntProcedure, Float.POSITIVE_INFINITY);
         V ret = found;
         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);
+        rtree.intersects(rect, myIntProcedure);
         visitor = null;
     }