14 #ifndef OSG_BOUNDINGBOX
15 #define OSG_BOUNDINGBOX 1
62 value_type xmax, value_type ymax, value_type zmax) :
64 _max(xmax,ymax,zmax) {}
88 return _max.x()>=_min.x() && _max.y()>=_min.y() && _max.z()>=_min.z();
92 inline void set (value_type xmin, value_type ymin, value_type zmin,
93 value_type xmax, value_type ymax, value_type zmax)
95 _min.set(xmin,ymin,zmin);
96 _max.set(xmax,ymax,zmax);
100 inline void set(
const vec_type& min,
const vec_type& max)
107 inline value_type&
xMin() {
return _min.x(); }
108 inline value_type
xMin()
const {
return _min.x(); }
110 inline value_type&
yMin() {
return _min.y(); }
111 inline value_type
yMin()
const {
return _min.y(); }
113 inline value_type&
zMin() {
return _min.z(); }
114 inline value_type
zMin()
const {
return _min.z(); }
116 inline value_type&
xMax() {
return _max.x(); }
117 inline value_type
xMax()
const {
return _max.x(); }
119 inline value_type&
yMax() {
return _max.y(); }
120 inline value_type
yMax()
const {
return _max.y(); }
122 inline value_type&
zMax() {
return _max.z(); }
123 inline value_type
zMax()
const {
return _max.z(); }
128 return (_min+_max)*0.5;
141 return 0.25*((_max-
_min).length2());
149 inline const vec_type
corner(
unsigned int pos)
const
151 return vec_type(pos&1?_max.x():_min.x(),pos&2?_max.y():_min.y(),pos&4?_max.z():_min.z());
158 if(v.x()<_min.x()) _min.x() = v.x();
159 if(v.x()>_max.x()) _max.x() = v.x();
161 if(v.y()<_min.y()) _min.y() = v.y();
162 if(v.y()>_max.y()) _max.y() = v.y();
164 if(v.z()<_min.z()) _min.z() = v.z();
165 if(v.z()>_max.z()) _max.z() = v.z();
171 inline void expandBy(value_type x,value_type y,value_type z)
173 if(x<_min.x()) _min.x() = x;
174 if(x>_max.x()) _max.x() = x;
176 if(y<_min.y()) _min.y() = y;
177 if(y>_max.y()) _max.y() = y;
179 if(z<_min.z()) _min.z() = z;
180 if(z>_max.z()) _max.z() = z;
187 if (!bb.
valid())
return;
189 if(bb.
_min.x()<_min.x()) _min.x() = bb.
_min.x();
190 if(bb.
_max.x()>_max.x()) _max.x() = bb.
_max.x();
192 if(bb.
_min.y()<_min.y()) _min.y() = bb.
_min.y();
193 if(bb.
_max.y()>_max.y()) _max.y() = bb.
_max.y();
195 if(bb.
_min.z()<_min.z()) _min.z() = bb.
_min.z();
196 if(bb.
_max.z()>_max.z()) _max.z() = bb.
_max.z();
201 template<
typename BST>
204 if (!sh.
valid())
return;
236 (v.x()>=_min.x() && v.x()<=_max.x()) &&
237 (v.y()>=_min.y() && v.y()<=_max.y()) &&
238 (v.z()>=_min.z() && v.z()<=_max.z());
242 inline bool contains(
const vec_type& v, value_type epsilon)
const
245 ((v.x()+epsilon)>=_min.x() && (v.x()-epsilon)<=_max.x()) &&
246 ((v.y()+epsilon)>=_min.y() && (v.y()-epsilon)<=_max.y()) &&
247 ((v.z()+epsilon)>=_min.z() && (v.z()-epsilon)<=_max.z());
254 #ifdef OSG_USE_FLOAT_BOUNDINGBOX
BoundingBoxImpl intersect(const BoundingBoxImpl &bb) const
value_type radius() const
bool contains(const vec_type &v, value_type epsilon) const
bool operator!=(const BoundingBoxImpl &rhs) const
BoundingBoxImpl< Vec3f > BoundingBoxf
void expandBy(const BoundingSphereImpl< BST > &sh)
VT::value_type value_type
void set(const vec_type &min, const vec_type &max)
void set(value_type xmin, value_type ymin, value_type zmin, value_type xmax, value_type ymax, value_type zmax)
BoundingBoxImpl< Vec3d > BoundingBoxd
void expandBy(const vec_type &v)
void expandBy(const BoundingBoxImpl &bb)
value_type radius2() const
bool operator==(const BoundingBoxImpl &rhs) const
const vec_type corner(unsigned int pos) const
BoundingBoxImpl(value_type xmin, value_type ymin, value_type zmin, value_type xmax, value_type ymax, value_type zmax)
BoundingBoxImpl(const vec_type &min, const vec_type &max)
bool contains(const vec_type &v) const
bool intersects(const BoundingBoxImpl &bb) const
void expandBy(value_type x, value_type y, value_type z)
const vec_type center() const
BoundingBoxImpl(const BoundingBoxImpl< BT > &bb)