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
00026
00027
00028
00029
00030
00031
00032
00033
00034
00037 #ifndef FCL_KDOP_H
00038 #define FCL_KDOP_H
00039
00040
00041 #include "fcl/math/vec_3f.h"
00042
00043 namespace fcl
00044 {
00045
00046
00059 template<size_t N>
00060 class KDOP
00061 {
00062 public:
00063
00065 KDOP();
00066
00068 KDOP(const Vec3f& v);
00069
00071 KDOP(const Vec3f& a, const Vec3f& b);
00072
00074 bool overlap(const KDOP<N>& other) const;
00075
00077 bool inside(const Vec3f& p) const;
00078
00080 KDOP<N>& operator += (const Vec3f& p);
00081
00083 KDOP<N>& operator += (const KDOP<N>& other);
00084
00086 KDOP<N> operator + (const KDOP<N>& other) const;
00087
00089 inline FCL_REAL width() const
00090 {
00091 return dist_[N / 2] - dist_[0];
00092 }
00093
00095 inline FCL_REAL height() const
00096 {
00097 return dist_[N / 2 + 1] - dist_[1];
00098 }
00099
00101 inline FCL_REAL depth() const
00102 {
00103 return dist_[N / 2 + 2] - dist_[2];
00104 }
00105
00107 inline FCL_REAL volume() const
00108 {
00109 return width() * height() * depth();
00110 }
00111
00113 inline FCL_REAL size() const
00114 {
00115 return width() * width() + height() * height() + depth() * depth();
00116 }
00117
00119 inline Vec3f center() const
00120 {
00121 return Vec3f(dist_[0] + dist_[N / 2], dist_[1] + dist_[N / 2 + 1], dist_[2] + dist_[N / 2 + 2]) * 0.5;
00122 }
00123
00125 FCL_REAL distance(const KDOP<N>& other, Vec3f* P = NULL, Vec3f* Q = NULL) const;
00126
00127 private:
00129 FCL_REAL dist_[N];
00130
00131 public:
00132 inline FCL_REAL dist(std::size_t i) const
00133 {
00134 return dist_[i];
00135 }
00136
00137 inline FCL_REAL& dist(std::size_t i)
00138 {
00139 return dist_[i];
00140 }
00141
00142
00143 };
00144
00145
00147 template<size_t N>
00148 KDOP<N> translate(const KDOP<N>& bv, const Vec3f& t);
00149
00150 }
00151
00152 #endif