projects
/
anneal.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
checkpoint
[anneal.git]
/
src
/
edu
/
berkeley
/
qfat
/
geom
/
PointSet.java
diff --git
a/src/edu/berkeley/qfat/geom/PointSet.java
b/src/edu/berkeley/qfat/geom/PointSet.java
index
8c6642c
..
c1b4cf9
100644
(file)
--- a/
src/edu/berkeley/qfat/geom/PointSet.java
+++ b/
src/edu/berkeley/qfat/geom/PointSet.java
@@
-1,19
+1,20
@@
package edu.berkeley.qfat.geom;
package edu.berkeley.qfat.geom;
-import edu.wlu.cs.levy.CG.KDTree;
import java.util.*;
import java.util.*;
+/** a set of points, plus many useful methods operating over the set */
public class PointSet<V extends HasPoint> implements Iterable<V> {
public class PointSet<V extends HasPoint> implements Iterable<V> {
- private /*final*/ KDTree kd = new KDTree(3);
- private final double[] doubles = new double[3];
+ private RTree<V> rtree = new RTree<V>();
private HashMap<Point,V> exact = new HashMap<Point,V>();
private HashMap<Point,V> exact = new HashMap<Point,V>();
- public Iterator<V> iterator() {
- return exact.values().iterator();
- }
+ public int size() { return exact.size(); }
+
+ public Iterator<V> iterator() { return rtree.iterator(); }
+
public void clear() {
public void clear() {
- kd = new KDTree(3);
+ exact.clear();
+ rtree = new RTree<V>();
}
public V get(Point p) {
}
public V get(Point p) {
@@
-25,43
+26,22
@@
public class PointSet<V extends HasPoint> implements Iterable<V> {
if (x != null && x.equals(v)) return;
if (x != null) throw new Error("duplicates!");
Point p = v.getPoint();
if (x != null && x.equals(v)) return;
if (x != null) throw new Error("duplicates!");
Point p = v.getPoint();
- doubles[0] = p.x;
- doubles[1] = p.y;
- doubles[2] = p.z;
- try {
- kd.insert(doubles, v);
- } catch (Exception e) {
- throw new Error(e);
- }
+ rtree.insert(v);
exact.put(p, v);
}
exact.put(p, v);
}
- public void remove(HasPoint v) { remove(v.getPoint()); }
- public void remove(Point p) {
- doubles[0] = p.x;
- doubles[1] = p.y;
- doubles[2] = p.z;
- try {
- kd.delete(doubles);
- } catch (Exception e) { }
+ public void remove(V v) {
+ Point p = v.getPoint();
+ rtree.remove(v);
exact.remove(p);
}
public V nearest(Point p) {
if (exact.size()==0) return null;
exact.remove(p);
}
public V nearest(Point p) {
if (exact.size()==0) return null;
- Object[] results;
- try {
- doubles[0] = p.x;
- doubles[1] = p.y;
- doubles[2] = p.z;
- results = kd.nearest(doubles,1);
- } catch (Exception e) {
- throw new Error(e);
- }
- return (V)results[0];
+ return rtree.nearest(p);
}
}
-
+ // FEATURE: compute incrementally?
public Vec diagonal() {
float min_x = Float.MAX_VALUE;
float min_y = Float.MAX_VALUE;
public Vec diagonal() {
float min_x = Float.MAX_VALUE;
float min_y = Float.MAX_VALUE;
@@
-69,7
+49,8
@@
public class PointSet<V extends HasPoint> implements Iterable<V> {
float max_x = Float.MIN_VALUE;
float max_y = Float.MIN_VALUE;
float max_z = Float.MIN_VALUE;
float max_x = Float.MIN_VALUE;
float max_y = Float.MIN_VALUE;
float max_z = Float.MIN_VALUE;
- for(Point p : exact.keySet()) {
+ for(V v : this) {
+ Point p = v.getPoint();
if (p.x < min_x) min_x = p.x;
if (p.y < min_y) min_y = p.y;
if (p.z < min_z) min_z = p.z;
if (p.x < min_x) min_x = p.x;
if (p.y < min_y) min_y = p.y;
if (p.z < min_z) min_z = p.z;
@@
-80,6
+61,7
@@
public class PointSet<V extends HasPoint> implements Iterable<V> {
return new Vec(max_x - min_x, max_y - min_y, max_z - min_z);
}
return new Vec(max_x - min_x, max_y - min_y, max_z - min_z);
}
+ // FEATURE: compute incrementally?
public Point centroid() {
float min_x = Float.MAX_VALUE;
float min_y = Float.MAX_VALUE;
public Point centroid() {
float min_x = Float.MAX_VALUE;
float min_y = Float.MAX_VALUE;
@@
-87,7
+69,8
@@
public class PointSet<V extends HasPoint> implements Iterable<V> {
float max_x = Float.MIN_VALUE;
float max_y = Float.MIN_VALUE;
float max_z = Float.MIN_VALUE;
float max_x = Float.MIN_VALUE;
float max_y = Float.MIN_VALUE;
float max_z = Float.MIN_VALUE;
- for(Point p : exact.keySet()) {
+ for(V v : this) {
+ Point p = v.getPoint();
if (p.x < min_x) min_x = p.x;
if (p.y < min_y) min_y = p.y;
if (p.z < min_z) min_z = p.z;
if (p.x < min_x) min_x = p.x;
if (p.y < min_y) min_y = p.y;
if (p.z < min_z) min_z = p.z;