// Hyper-Rectangle class supporting KDTree class package edu.wlu.cs.levy.CG; 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(); } @Override 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] = Float.NEGATIVE_INFINITY; vmax.coord[i] = Float.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 float area() { float a = 1; for (int i = 0; i < min.coord.length; ++i) { a *= max.coord[i] - min.coord[i]; } return a; } @Override public String toString() { return min + "\n" + max + "\n"; } }