- public P newP(double x, double y, double z) { return newP((float)x, (float)y, (float)z); }
- public P newP(float x, float y, float z) {
- P p = new P(x, y, z);
- P p2 = ps.get(p);
- if (p2 != null) return p2;
- ps.put(p,p);
- p.name = allname++;
- try { kd.insert(new double[]{p.x,p.y,p.z},p); } catch (Exception e) { throw new Error(e); }
- return p;
+ public P origin() { return newP(0, 0, 0); }
+
+ public Geom score_against = null;
+ public double score = 0;
+ public float score() {
+ return (float)score;
+ }
+
+ public float rescore() {
+ int num = 0;
+ double dist = 0;
+ HashSet<V> done = new HashSet<V>();
+ for(T t : ts)
+ for(V p : new V[] { t.p1(), t.p2(), t.p3() }) {
+ if (done.contains(p)) continue;
+ done.add(p);
+ p.rescore();
+ }
+ for(T t : ts)
+ for(V p : new V[] { t.p1(), t.p2(), t.p3() })
+ p.kdremove();
+ kd = new KDTree(3);
+ for(T t : ts)
+ for(V p : new V[] { t.p1(), t.p2(), t.p3() })
+ p.kdinsert();
+ return (float)(dist/num);
+ }
+
+ public void transform(M m) {
+ ArrayList<V> set = new ArrayList<V>();
+ set.addAll(ps.values());
+ for(V v : set) v.transform(m);
+ }
+
+ public Vec diagonal() {
+ float min_x = Float.MAX_VALUE;
+ float min_y = Float.MAX_VALUE;
+ float min_z = Float.MAX_VALUE;
+ float max_x = Float.MIN_VALUE;
+ float max_y = Float.MIN_VALUE;
+ float max_z = Float.MIN_VALUE;
+ for(P p : ps.keySet()) {
+ 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 > max_x) max_x = p.x;
+ if (p.y > max_y) max_y = p.y;
+ if (p.z > max_z) max_z = p.z;
+ }
+ return new Vec(max_x - min_x, max_y - min_y, max_z - min_z);
+ }
+
+ public P centroid() {
+ float min_x = Float.MAX_VALUE;
+ float min_y = Float.MAX_VALUE;
+ float min_z = Float.MAX_VALUE;
+ float max_x = Float.MIN_VALUE;
+ float max_y = Float.MIN_VALUE;
+ float max_z = Float.MIN_VALUE;
+ for(P p : ps.keySet()) {
+ 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 > max_x) max_x = p.x;
+ if (p.y > max_y) max_y = p.y;
+ if (p.z > max_z) max_z = p.z;
+ }
+ return new P((float)(max_x + min_x)/2,
+ (float)(max_y + min_y)/2,
+ (float)(max_z + min_z)/2);