X-Git-Url: http://git.megacz.com/?p=anneal.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fqfat%2Fgeom%2FRTree.java;h=57f20c894faf0d434c820cbf6e91f32781f4d3f4;hp=cd1d21764cb6251e508bb621915b5a3c45efe004;hb=4561a5ff23ca77f6deb217d3cff6253057735d30;hpb=719b7ba4c0fe32a0c9e97aeb0156a999794dd0f7 diff --git a/src/edu/berkeley/qfat/geom/RTree.java b/src/edu/berkeley/qfat/geom/RTree.java index cd1d217..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(); - int lowid = 0; - HashMap idToV = new HashMap(); - HashMap vToId = new HashMap(); + private int lowid = 0; + 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,9 +43,9 @@ public class RTree implements Iterable { int id = lowid++; idToV.put(id, v); vToId.put(v, id); - rtree.add(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(), - v.getMaxX(), v.getMaxY(), v.getMaxZ()), - id); + Rectangle rect = new Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(), v.getMaxX(), v.getMaxY(), v.getMaxZ()); + rtree.add(rect, id); + vToRect.put(v, rect); } public void remove(V v) { @@ -45,41 +54,43 @@ public class RTree implements Iterable { int id = idi; idToV.remove(id); vToId.remove(v); - rtree.delete(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(), - v.getMaxX(), v.getMaxY(), v.getMaxZ()), - 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; + 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; - rtree.intersects(new com.infomatiq.jsi.Rectangle(v.getMinX(), v.getMinY(), v.getMinZ(), - v.getMaxX(), v.getMaxY(), v.getMaxZ()), - searcher); + 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; + } + } + } }