// Hyper-Rectangle class supporting KDTree class package org.codemap.kdtree; class HRect { protected HPoint min; protected HPoint max; protected HRect(int ndims) { min = new HPoint(ndims); max = new HPoint(ndims); } protected HRect(HPoint vmin, HPoint vmax) { min = (HPoint)vmin.clone(); max = (HPoint)vmax.clone(); } protected Object clone() { return new HRect(min, max); } // from Moore's eqn. 6.6 protected HPoint closest(HPoint t) { HPoint p = new HPoint(t.coord.length); for (int i=0; i<t.coord.length; ++i) { if (t.coord[i]<=min.coord[i]) { p.coord[i] = min.coord[i]; } else if (t.coord[i]>=max.coord[i]) { p.coord[i] = max.coord[i]; } else { p.coord[i] = t.coord[i]; } } return p; } // used in initial conditions of KDTree.nearest() protected static HRect infiniteHRect(int d) { HPoint vmin = new HPoint(d); HPoint vmax = new HPoint(d); for (int i=0; i<d; ++i) { vmin.coord[i] = Double.NEGATIVE_INFINITY; vmax.coord[i] = Double.POSITIVE_INFINITY; } return new HRect(vmin, vmax); } // currently unused protected HRect intersection(HRect r) { HPoint newmin = new HPoint(min.coord.length); HPoint newmax = new HPoint(min.coord.length); for (int i=0; i<min.coord.length; ++i) { newmin.coord[i] = Math.max(min.coord[i], r.min.coord[i]); newmax.coord[i] = Math.min(max.coord[i], r.max.coord[i]); if (newmin.coord[i] >= newmax.coord[i]) return null; } return new HRect(newmin, newmax); } // currently unused protected double area () { double a = 1; for (int i=0; i<min.coord.length; ++i) { a *= (max.coord[i] - min.coord[i]); } return a; } public String toString() { return min + "\n" + max + "\n"; } }