aaboundingbox.h
1.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#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<T> A; //minimum point in the bounding box
stim::vec3<T> 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<T> 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<T> 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<T> center(){
return (B + A) * 0.5;
}
/// Return the size of the bounding box as a stim::vec
stim::vec3<T> size(){
return (B - A);
}
/// Generate a string for the bounding box
std::string str(){
std::stringstream ss;
ss<<A.str()<<"----->"<<B.str();
return ss.str();
}
}; //end stim::aabb
}; //end namespace stim
#endif