/* See box.h. */ /* Last edited on 2002-11-09 03:58:47 by stolfi */ #include #include #include #include #include void box_corner(box_Dim d, box_Interval *b, box_Corner c, Float *x) { int i; for (i = 0; i < d; i ++) { x[i] = (c & 1 ? b[i].hi : b[i].lo); c <<= 1; } } void box_center(box_Dim d, box_Interval *b, Float *x) { int i; for (i = 0; i < d; i ++) { x[i] = ia_mid(b[i]); } } box_Axis box_max_axis(box_Dim d, box_Interval *b) { int i, imax; Float dmax = MinusInfinity; for (i = 0; i < d; i ++) { Float ri = ia_rad(b[i]); if (ri > dmax) { dmax = ri; imax = i; } } return imax; } Float box_max_rad(box_Dim d, box_Interval *b) { int i; Float dmax = MinusInfinity; for (i = 0; i < d; i ++) { Float ri = ia_rad(b[i]); if (ri > dmax) { dmax = ri; } } return dmax; } double box_radius(box_Dim d, box_Interval *b) { int i; double r, r2 = Zero; ROUND_UP; for (i = 0; i < d; i ++) { double ri = (double)(ia_rad(b[i])); r2 += ri*ri; } r = sqrt(r2); ROUND_NEAR; return r; } void box_from_corners(box_Dim d, Float *x, Float *y, box_Interval *b) { int i; for (i = 0; i < d; i ++) { Float xi = x[i]; Float yi = y[i]; if (xi <= yi) { b[i].lo = xi; b[i].hi = yi; } else { b[i].lo = yi; b[i].hi = xi; } } } void box_split(box_Dim d, box_Axis k, box_Dir dir, box_Interval *b, box_Interval *h) { int i; for (i = 0; i < d; i ++) { box_Interval *hp = &(h[i]); *hp = b[i]; if (i == k) { Float md = ia_mid(*hp); if (dir != HI) { hp->hi = md; } if (dir != LO) { hp->lo = md; } } } }