00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BOX_H
00009 #define BOX_H
00010
00011 #include "Interval.h"
00012 #include "RandomStream.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021 template <class Float>
00022 class Box : public TNT::Vector< Interval<Float> >
00023 {
00024 private:
00025 RandomStream rs;
00026
00027 public:
00028
00029 Box();
00030 Box(int n);
00031 Box(int n, Float x);
00032 Box(TNT::Vector<Float> x);
00033
00034
00035 Box<Float>& operator *=(const Interval<Float> &c);
00036 Box<Float>& operator /=(const Interval<Float> &c);
00037 Box<Float>& operator +=(const Interval<Float> &c);
00038
00039
00040 Float width(int &dim);
00041 Float width();
00042 Interval<Float> length();
00043 Interval<Float> lengthSquared();
00044 Box<Float> normalize();
00045
00046
00047 Box<Float> unionWith(Box<Float> &b);
00048 void subdivide(Box<Float> &IX1, Box<Float> &IX2);
00049 TNT::Vector<Float> center();
00050
00051
00052 void print();
00053 };
00054
00055
00056
00057
00058
00059 template class Box<double>;
00060
00061
00062 template <class Float>
00063 Box<Float> operator *(const Box<Float> &x, const Interval<Float> &y)
00064 {
00065 Box<Float> z = x;
00066 return (z *= y);
00067 }
00068
00069
00070 template <class Float>
00071 Box<Float> operator *(const Interval<Float> &x, const Box<Float> &y)
00072 {
00073 Box<Float> z = y;
00074 return (z *= x);
00075 }
00076
00077
00078 template <class Float>
00079 Box<Float> operator /(const Box<Float> &x, const Interval<Float> &y)
00080 {
00081 Box<Float> z = x;
00082 return (z /= y);
00083 }
00084
00085
00086 template <class Float>
00087 Box<Float> operator +(const Box<Float> &x, const Interval<Float> &y)
00088 {
00089 Box<Float> z = x;
00090 return (z += y);
00091 }
00092
00093
00094 template <class Float>
00095 Box<Float> operator +(const Interval<Float> &x, const Box<Float> &y)
00096 {
00097 Box<Float> z = y;
00098 return (z += x);
00099 }
00100
00101
00102 template <class Float>
00103 Interval<Float> dot(const Box<Float> &x, const Box<Float> &y)
00104 {
00105 Interval<Float> sum = 0.0;
00106 for (int i = 0; i < x.size(); i++)
00107 sum += x[i] * y[i];
00108
00109 return sum;
00110 }
00111
00112
00113 template<class Float>
00114 std::ostream& operator<<(std::ostream& os, const Box<Float>& x)
00115 {
00116 os << "[ ";
00117 for (int i = 0; i < x.size(); i++)
00118 {
00119 os << x[i];
00120 if (i < (x.size()-1))
00121 os << ", ";
00122 }
00123 return os << " ]";
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133 class Box3d : public Box<double>
00134 {
00135 public:
00136
00137 Box3d();
00138 Box3d(TNT::Vector< Interval<double> > A);
00139 Box3d(gmVector3 mincorner, gmVector3 maxcorner);
00140 Box3d(gmVector3 x);
00141 Box3d(Interval<double> x, Interval<double> y, Interval<double> z);
00142 Box3d(Interval<double> v);
00143 Box3d(double d);
00144 Box3d(Box<double> x);
00145
00146
00147 gmVector3 low();
00148 gmVector3 high();
00149 };
00150
00151
00152
00153
00154
00155
00156
00157
00158 class Box4d : public Box<double>
00159 {
00160 public:
00161
00162 Box4d();
00163 Box4d(TNT::Vector< Interval<double> >);
00164 Box4d(gmVector4 mincorner, gmVector4 maxcorner);
00165 Box4d(gmVector4 x);
00166 Box4d(Interval<double>,Interval<double>,Interval<double>,Interval<double>);
00167 Box4d(Interval<double>);
00168 Box4d(double d);
00169 Box4d(Box<double>);
00170
00171
00172 gmVector4 low();
00173 gmVector4 high();
00174 };
00175
00176 #endif
00177