Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __SP_DIMENSION_OBB_H__
00009 #define __SP_DIMENSION_OBB_H__
00010
00011
00012 #include "Base/spStandard.hpp"
00013 #include "Base/spMathCore.hpp"
00014 #include "Base/spDimensionVector3D.hpp"
00015
00016
00017 namespace sp
00018 {
00019 namespace dim
00020 {
00021
00022
00023 template <typename T> class obbox3d
00024 {
00025
00026 public:
00027
00028 obbox3d()
00029 {
00030 }
00031 obbox3d(const vector3d<T> &Min, const vector3d<T> &Max) :
00032 Center ((Min + Max) / 2),
00033 Axis(
00034 vector3d<T>(1, 0, 0),
00035 vector3d<T>(0, 1, 0),
00036 vector3d<T>(0, 0, 1)
00037 ),
00038 HalfSize((Max - Min) / 2)
00039 {
00040 }
00041 obbox3d(const vector3d<T> &BoxCenter, const vector3d<T> &AxisX, const vector3d<T> &AxisY, const vector3d<T> &AxisZ) :
00042 Center (BoxCenter ),
00043 Axis (AxisX, AxisY, AxisZ)
00044 {
00045 updateHalfSize();
00046 }
00047 obbox3d(const obbox3d<T> &Other) :
00048 Center (Other.Center ),
00049 Axis (Other.Axis ),
00050 HalfSize(Other.HalfSize )
00051 {
00052 }
00053 ~obbox3d()
00054 {
00055 }
00056
00057
00058
00059 inline void updateHalfSize()
00060 {
00061
00062 HalfSize.X = Axis.X.getLength();
00063 HalfSize.Y = Axis.Y.getLength();
00064 HalfSize.Z = Axis.Z.getLength();
00065
00066
00067 Axis.X *= (T(1) / HalfSize.X);
00068 Axis.Y *= (T(1) / HalfSize.Y);
00069 Axis.Z *= (T(1) / HalfSize.Z);
00070 }
00071
00072 inline T getVolume() const
00073 {
00074 return (HalfSize * vector3d<T>(2)).getVolume();
00075 }
00076
00082 inline bool isInversePointInside(const vector3d<T> &InvPoint) const
00083 {
00084 return
00085 math::Abs(InvPoint.X) < T(1) &&
00086 math::Abs(InvPoint.Y) < T(1) &&
00087 math::Abs(InvPoint.Z) < T(1);
00088 }
00089
00091 inline bool isPointInside(const vector3d<T> &Point) const;
00092
00094 inline bool isBoxInside(const obbox3d<T> &Other) const;
00095
00096
00097
00098 vector3d<T> Center;
00099 vector3d< vector3d<T> > Axis;
00100 vector3d<T> HalfSize;
00101
00102 };
00103
00104 typedef obbox3d<s32> obbox3di;
00105 typedef obbox3d<f32> obbox3df;
00106
00107
00108 }
00109
00110 }
00111
00112
00113 #endif
00114
00115
00116
00117