#ifndef STIM_AABB #define STIM_AABB namespace stim{ /// This class describes a structure for an axis-aligned bounding box template< typename T > class aaboundingbox{ public: bool set; //has the bounding box been set to include any points? stim::vec3 A; //minimum point in the bounding box stim::vec3 B; //maximum point in the bounding box aaboundingbox(){ //constructor generates an empty bounding box set = false; } /// Test if a point is inside of the bounding box and returns true if it is. /// @param p is the point to be tested bool test(stim::vec3 p){ for(unsigned d = 0; d < p.size(); p++){ //for each dimension if(p[d] < A[d]) return false; //if the point is less than the minimum bound, return false if(p[d] > B[d]) return false; //if the point is greater than the max bound, return false } return true; } /// Expand the bounding box to include the specified point. /// @param p is the point to be included void expand(stim::vec3 p){ if(!set){ //if the bounding box is empty, fill it with the current point A = B = p; set = true; } for(unsigned d = 0; d < p.size(); d++){ //for each dimension if(p[d] < A[d]) A[d] = p[d]; //expand the bounding box as necessary if(p[d] > B[d]) B[d] = p[d]; } } /// Return the center point of the bounding box as a stim::vec stim::vec3 center(){ return (B + A) * 0.5; } /// Return the size of the bounding box as a stim::vec stim::vec3 size(){ return (B - A); } /// Generate a string for the bounding box std::string str(){ std::stringstream ss; ss<"<