BBox BBoxIntersection(const BBox &b1, const BBox &b2) { BBox newbox(b1.dimension()); ThrowAssert(b1.dimension() == b2.dimension()); for (UInt i = 0; i < b1.dimension(); i++) { newbox.setMin(i, std::max(b1.getMin()[i], b2.getMin()[i])); newbox.setMax(i, std::min(b1.getMax()[i], b2.getMax()[i])); } newbox.checkEmpty(); return newbox; }
bool BBoxIntersect(const BBox &b1, const BBox &b2, double tol) { double newmin; double newmax; ThrowAssert(b1.dimension() == b2.dimension()); for (UInt i = 0; i < b1.dimension(); i++) { newmin = std::max(b1.getMin()[i], b2.getMin()[i]); newmax = std::min(b1.getMax()[i], b2.getMax()[i]); if (newmin > (newmax+tol)) { //std::cout << "fail, dim=" << i << " newmin=" << newmin << ", newmax=" << newmax << std::endl; return false; } } return true; }
BBox BBoxParUnion(const BBox &b1) { double val, valres; BBox newbox(b1.dimension()); for (UInt i = 0; i < b1.dimension(); i++) { // Find max val = b1.getMax()[i]; MPI_Allreduce(&val, &valres, 1, MPI_DOUBLE, MPI_MAX, Par::Comm()); newbox.setMax(i, valres); val = b1.getMin()[i]; MPI_Allreduce(&val, &valres, 1, MPI_DOUBLE, MPI_MIN, Par::Comm()); newbox.setMin(i, valres); } newbox.checkEmpty(); return newbox; }
bool BBoxPointIn(const BBox &b, double point[], double tol) { for (UInt i = 0; i < b.dimension(); i++) { if (point[i] < b.getMin()[i] - tol || point[i] > b.getMax()[i] + tol) return false; } return true; }