00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _PHYSICS_BOUNDINGBOX_
00026 #define _PHYSICS_BOUNDINGBOX_
00027
00028 #include <physics/physics>
00029
00030 #include <base/Dimension3>
00031 #include <base/Transform>
00032
00033
00034 namespace physics {
00035
00036
00037 class BoundingBox
00038 {
00039 public:
00040 BoundingBox() {}
00041 BoundingBox(const BoundingBox& bb)
00042 : center(bb.center), extent(bb.extent) {}
00043 BoundingBox(const base::Point3& lower, const base::Point3& upper)
00044 { setExtents(lower,upper); }
00045 ~BoundingBox() {}
00046
00047 base::Point3 lower() const { return center-extent; }
00048 base::Point3 upper() const { return center+extent; }
00049
00050
00051 void setExtents(const base::Point3& lower, const base::Point3& upper)
00052 { extent = (upper-lower)/2.0; center = lower+extent; }
00053
00054 void setCenter(const base::Point3& center) { this->center=center; }
00055 void setDimension(const base::Dimension3& dim) { extent = dim/2.0; }
00056 base::Dimension3 getDimension() const { return extent*2.0; }
00057
00058 void setEmpty() {
00059 center=base::Point3();
00060 extent=base::Vector3(-consts::Infinity,-consts::Infinity,-consts::Infinity);
00061 }
00062
00063 void enclose(const BoundingBox& a, const BoundingBox& b);
00064 void include(const base::Point3& p);
00065 void include(const BoundingBox& bb) { enclose(*this, bb); }
00066
00067
00068
00069 void transform(const base::Transform& t);
00070
00071
00072 Real size() const { return Math::maximum(Math::maximum(extent.x,extent.y),extent.z); }
00073
00074 Int longestAxis() const { return extent.largestAxis(); }
00075
00076 static bool intersect(const BoundingBox& a, const BoundingBox& b) {
00077 return (Math::abs(a.center.x - b.center.x) <= (a.extent.x + b.extent.x)) &&
00078 (Math::abs(a.center.y - b.center.y) <= (a.extent.y + b.extent.y)) &&
00079 (Math::abs(a.center.z - b.center.z) <= (a.extent.z + b.extent.z));
00080 }
00081
00082 private:
00083 base::Point3 center;
00084 base::Vector3 extent;
00085 };
00086
00087
00088 }
00089
00090 #endif