Main Page   Class Hierarchy   Compound List   File List   Compound Members   File Members  

bbox.H

Go to the documentation of this file.
00001 #ifndef GLUE_MLIBBBOX_H
00002 #define GLUE_MLIBBBOX_H
00003 #include "std/config.H"
00004 #ifdef min
00005 #undef min
00006 #endif
00007 #ifdef max
00008 #undef max
00009 #endif
00010 template <class P, class V>
00011 class BBOX {
00012    public:
00013       BBOX() : _valid(false) {}
00014       BBOX(const P &l, const P &h) : _valid(true), _min(l), _max(h) {}
00015       BBOX(const BBOX<P,V> &b) : _valid(b._valid), _min(b._min),_max(b._max) {}
00016       void      reset()                         { _valid = false; }
00017       bool      valid()                  const  { return _valid;  }
00018       const P  &min()                    const  { return _min;    }
00019       const P  &max()                    const  { return _max;    }
00020             P   center()                 const  { return (_min % _max)/2; }
00021             V   dim()                    const  { return _max - _min; }
00022       bool      overlaps  (const BBOX<P,V> &bbox) const  {
00023          if (!_valid) return false;
00024          else return (bbox.min()[0] <= max()[0] && bbox.max()[0] >= min()[0] &&
00025                       bbox.min()[1] <= max()[1] && bbox.max()[1] >= min()[1] &&
00026                       bbox.min()[2] <= max()[2] && bbox.max()[2] >= min()[2]);
00027       }
00028       BBOX<P,V> &update(const P &p) {
00029          if (!_valid) {
00030             _min = p;
00031             _max = p;
00032             _valid = true;
00033          } else {
00034             for (int i=0;i<3;i++) {
00035                if (p[i] < _min[i]) _min[i] = p[i];
00036                if (p[i] > _max[i]) _max[i] = p[i];
00037             }
00038          }
00039          return *this;
00040       }
00041 
00042       bool      contains  (const P &p)   const  {
00043          if (!_valid) return false;
00044          else return p[0] >= _min[0] && p[1] >= _min[1] && p[2] >= _min[2] &&
00045                      p[0] <= _max[0] && p[1] <= _max[1] && p[2] <= _max[2];
00046       }
00047 
00048       BBOX<P,V>  &operator+=(const BBOX<P,V> &b)
00049          { return (!b.valid() ? *this : update(b.min()).update(b.max()));}
00050       bool operator==(const BBOX<P,V> &bb) const
00051          { return (!bb.valid() && !valid()) ||
00052                    bb.valid() == valid() &&
00053                    bb.min() == min() &&
00054                    bb.max()==max(); }
00055       friend ostream &operator <<(ostream &os,const BBOX<P,V> &b)
00056       { if (b.valid()) os <<b.min()<<b.max();
00057         else os << "(invalid)";
00058         return os; }
00059 
00060    protected:
00061       bool _valid;
00062       P    _min, _max;
00063 };
00064 #endif

Generated on Mon Sep 15 16:25:56 2003 for gluebase by doxygen1.2.18