00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __OSL_BBOX_H
00009 #define __OSL_BBOX_H
00010
00011 #include "pup.h"
00012 #include "ckvector3d.h"
00013
00014
00015 template <class T>
00016 class seg1dT {
00017 typedef seg1dT<T> seg1d;
00018 T min,max;
00019 public:
00020 seg1dT(void) {}
00021 seg1dT(T Nmin,T Nmax) :min(Nmin),max(Nmax) {}
00022
00023 void init(T a,T b,T c) {
00024 if (a<b) min=a,max=b; else min=b,max=a;
00025 if (c<min) min=c;
00026 else if (c>max) max=c;
00027 }
00028 T getMin(void) const {return min;}
00029 T getMax(void) const {return max;}
00030 void setMin(T m) {min=m;}
00031 void setMax(T m) {max=m;}
00032
00033
00034 seg1d &empty(void) {
00035 min=2000000000; max=-2000000000; return *this;
00036 }
00037
00038 seg1d &infinity(void) {
00039 min=-2000000000; max=2000000000; return *this;
00040 }
00041
00042 bool isEmpty(void) const { return max<min;}
00043
00044 seg1d &set(T b) {min=max=b; return *this;}
00045
00046 seg1d &set(T a,T b) {
00047 if (a<b) {min=a;max=b;}
00048 else {min=b;max=a;}
00049 return *this;
00050 }
00051
00052 void expandMin(T b) {if (min>b) min=b;}
00053 void expandMax(T b) {if (max<b) max=b;}
00054 seg1d &add(T b) {
00055 expandMin(b);expandMax(b);
00056 return *this;
00057 }
00058
00059 seg1d &add(const seg1d &b) {
00060 expandMin(b.min);expandMax(b.max);
00061 return *this;
00062 }
00063
00064
00065 seg1d getIntersection(const seg1d &b) const {
00066 return seg1d(min>b.min?min:b.min, max<b.max?max:b.max);
00067 }
00068
00069 seg1d getUnion(const seg1d &b) const {
00070 return seg1d(min<b.min?min:b.min, max>b.max?max:b.max);
00071 }
00072
00073
00074
00075 bool contains(T b) const {
00076 return (min<=b)&&(b<=max);
00077 }
00078
00079
00080 bool containsOpen(T b) const {
00081 return (min<b)&&(b<max);
00082 }
00083
00084
00085 bool containsHalf(T b) const {
00086 return (min<=b)&&(b<max);
00087 }
00088
00089 bool intersects(const seg1d &b) const {
00090 return contains(b.min)||b.contains(min);
00091 }
00092
00093 bool intersectsOpen(const seg1d &b) const {
00094 return containsHalf(b.min)||b.containsOpen(min);
00095 }
00096
00097 bool intersectsHalf(const seg1d &b) const {
00098 return containsHalf(b.min)||b.containsHalf(min);
00099 }
00100
00101 inline void pup(PUP::er &p) {
00102 p|min;
00103 p|max;
00104 }
00105 };
00106 typedef seg1dT<double> rSeg1d;
00107 typedef seg1dT<int> iSeg1d;
00108
00109 class bbox3d {
00110 rSeg1d segs[3];
00111 public:
00112 bbox3d() {}
00113 bbox3d(const rSeg1d &x,const rSeg1d &y,const rSeg1d &z)
00114 {segs[0]=x; segs[1]=y; segs[2]=z;}
00115 bbox3d(const CkVector3d &a,const CkVector3d &b,const CkVector3d &c)
00116 {
00117 segs[0].init(a[0],b[0],c[0]);
00118 segs[1].init(a[1],b[1],c[1]);
00119 segs[2].init(a[2],b[2],c[2]);
00120 }
00121
00122 void print(const char *desc=NULL) const;
00123
00124 rSeg1d &axis(int i) {return segs[i];}
00125 const rSeg1d &axis(int i) const {return segs[i];}
00126
00127 void add(const CkVector3d &b) {
00128 for (int i=0;i<3;i++) segs[i].add(b[i]);
00129 }
00130 void add(const bbox3d &b) {
00131 for (int i=0;i<3;i++) segs[i].add(b.segs[i]);
00132 }
00133 bbox3d getUnion(const bbox3d &b) {
00134 return bbox3d(segs[0].getUnion(b.segs[0]),
00135 segs[1].getUnion(b.segs[1]),
00136 segs[2].getUnion(b.segs[2]));
00137 }
00138 bbox3d getIntersection(const bbox3d &b) {
00139 return bbox3d(segs[0].getIntersection(b.segs[0]),
00140 segs[1].getIntersection(b.segs[1]),
00141 segs[2].getIntersection(b.segs[2]));
00142 }
00143
00144 bool intersects(const bbox3d &b) const {
00145 for (int i=0;i<3;i++)
00146 if (!segs[i].intersects(b.segs[i])) return false;
00147 return true;
00148 }
00149
00150 bool intersectsOpen(const bbox3d &b) const {
00151 for (int i=0;i<3;i++)
00152 if (!segs[i].intersectsOpen(b.segs[i])) return false;
00153 return true;
00154 }
00155
00156 bool contains(const CkVector3d &b) const {
00157 for (int i=0;i<3;i++)
00158 if (!segs[i].contains(b[i])) return false;
00159 return true;
00160 }
00161
00162 bool containsOpen(const CkVector3d &b) const {
00163 for (int i=0;i<3;i++)
00164 if (!segs[i].containsOpen(b[i])) return false;
00165 return true;
00166 }
00167
00168 bool containsHalf(const CkVector3d &b) const {
00169 for (int i=0;i<3;i++)
00170 if (!segs[i].containsHalf(b[i])) return false;
00171 return true;
00172 }
00173 void empty(void) {
00174 for (int i=0;i<3;i++) segs[i].empty();
00175 }
00176 void infinity(void) {
00177 for (int i=0;i<3;i++) segs[i].infinity();
00178 }
00179 bool isEmpty(void) const {
00180 for (int i=0;i<3;i++) if (segs[i].isEmpty()) return true;
00181 return false;
00182 }
00183 CkVector3d getSmallest(void) const
00184 {
00185 return CkVector3d(segs[0].getMin(),
00186 segs[1].getMin(),
00187 segs[2].getMin());
00188 }
00189 inline void pup(PUP::er &p) {
00190 p|segs[0]; p|segs[1]; p|segs[2];
00191 }
00192 };
00193
00194 #endif //def(thisHeader)