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 #include <physics/BoundingBox>
00026
00027 using physics::BoundingBox;
00028
00029 using base::Point3;
00030 using base::Transform;
00031
00032
00033 void BoundingBox::enclose(const BoundingBox& a, const BoundingBox& b)
00034 {
00035 Point3 alower(a.lower());
00036 Point3 blower(b.lower());
00037 Point3 aupper(a.upper());
00038 Point3 bupper(b.upper());
00039
00040 Point3 _lower(Math::minimum(alower.x, blower.x),
00041 Math::minimum(alower.y, blower.y),
00042 Math::minimum(alower.z, blower.z) );
00043 Point3 _upper(Math::maximum(aupper.x, bupper.x),
00044 Math::maximum(aupper.y, bupper.y),
00045 Math::maximum(aupper.z, bupper.z) );
00046 setExtents(_lower, _upper);
00047 }
00048
00049
00050 void BoundingBox::include(const base::Point3& p)
00051 {
00052 Point3 _lower(Math::minimum(lower().x, p.x),
00053 Math::minimum(lower().y, p.y),
00054 Math::minimum(lower().z, p.z) );
00055 Point3 _upper(Math::maximum(upper().x, p.x),
00056 Math::maximum(upper().y, p.y),
00057 Math::maximum(upper().z, p.z) );
00058 setExtents(_lower, _upper);
00059 }
00060
00061
00062 void BoundingBox::transform(const Transform& t)
00063 {
00064
00065 Point3 l(lower());
00066 Point3 u(upper());
00067
00068 array<Point3> v(8);
00069 v[0]=l;
00070 v[1]=Point3(l.x,u.y,l.z);
00071 v[2]=Point3(u.x,u.y,l.z);
00072 v[3]=Point3(u.x,l.y,l.z);
00073
00074 v[4]=Point3(l.x,l.y,u.z);
00075 v[5]=Point3(l.x,u.y,u.z);
00076 v[6]=u;
00077 v[7]=Point3(u.x,l.y,u.z);
00078
00079
00080 for(Int vi=0; vi<8; vi++)
00081 t.transformPoint(v[vi]);
00082
00083
00084 setEmpty();
00085 for(Int vi=0; vi<8; vi++)
00086 include(v[vi]);
00087 }