X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FRTree.java;h=57f20c894faf0d434c820cbf6e91f32781f4d3f4;hp=b9078e1e54bb4173be79ab54ca9db97822f7fa2b;hb=4561a5ff23ca77f6deb217d3cff6253057735d30;hpb=9a4c0a63db24cfe1787dbe798c2456271775fa88
diff --git a/src/edu/berkeley/qfat/geom/RTree.java b/src/edu/berkeley/qfat/geom/RTree.java
index b9078e1..57f20c8 100644
--- a/src/edu/berkeley/qfat/geom/RTree.java
+++ b/src/edu/berkeley/qfat/geom/RTree.java
@@ -4,17 +4,25 @@ import java.util.*;
import com.infomatiq.jsi.*;
import com.infomatiq.jsi.rtree.*;
+/** wrapper around the com.infomatiq.jsi.rtree.RTree class */
public class RTree implements Iterable {
private com.infomatiq.jsi.rtree.RTree rtree =
new com.infomatiq.jsi.rtree.RTree();
private int lowid = 0;
- private HashMap idToV = new HashMap();
- private HashMap vToId = new HashMap();
+ private HashMap idToV = new HashMap();
+ private HashMap vToId = new HashMap();
+ private HashMap vToRect = new HashMap();
public Iterator iterator() { return vToId.keySet().iterator(); }
+ private final MyIntProcedure myIntProcedure = new MyIntProcedure();
+ private final Rectangle rect = new 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 visitor = null;
+
private static final Properties props = new Properties();
static {
props.put("MinNodeEntries", "1");
@@ -26,6 +34,7 @@ public class RTree implements Iterable {
public void clear() {
idToV.clear();
vToId.clear();
+ vToRect.clear();
rtree.init(props);
}
@@ -34,51 +43,54 @@ public class RTree implements Iterable {
int id = lowid++;
idToV.put(id, v);
vToId.put(v, id);
- rect.set(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
+ Rectangle rect = new Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
rtree.add(rect, id);
+ vToRect.put(v, rect);
}
- 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;
int id = idi;
idToV.remove(id);
vToId.remove(v);
- rect.set(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
- rtree.delete(rect, id);
+ rtree.delete(vToRect.get(v), id);
+ vToRect.remove(v);
}
- // gross...
- V found = null;
- private IntProcedure finder = new IntProcedure() {
- public boolean execute(int id) {
- 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);
+ public V nearest(Point p) { return nearest(p, null); }
+ public V nearest(Point p, Visitor ip) {
+ point.set(p.x, p.y, p.z);
+ this.visitor = ip;
+ rtree.nearest(point, myIntProcedure, Float.POSITIVE_INFINITY);
+ this.visitor = null;
V ret = found;
found = null;
return ret;
}
- Visitor 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) {
+ 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);
+ rect.set(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ());
+ rtree.intersects(rect, myIntProcedure);
visitor = null;
}
+ public void range(Point p1, Point p2, Visitor vis) {
+ visitor = vis;
+ rect.set(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z);
+ rtree.intersects(rect, myIntProcedure);
+ visitor = null;
+ }
+
+ private class MyIntProcedure implements IntProcedure {
+ public boolean execute(int id) {
+ found = idToV.get(id);
+ if (visitor != null) {
+ return visitor.visit(found);
+ } else {
+ return false;
+ }
+ }
+ }
}