BALL  1.4.1
box3.h
Go to the documentation of this file.
00001 // -*- Mode: C++; tab-width: 2; -*-
00002 // vi: set ts=2:
00003 //
00004 // $Id: box3.h,v 1.46 2005/12/23 17:01:48 amoll Exp $
00005 //
00006 
00007 #ifndef BALL_MATHS_BOX3_H
00008 #define BALL_MATHS_BOX3_H
00009 
00010 #ifndef BALL_COMMON_H
00011 # include <BALL/common.h>
00012 #endif
00013 
00014 #ifndef BALL_MATHS_VECTOR3_H
00015 # include <BALL/MATHS/vector3.h>
00016 #endif
00017 
00018 namespace BALL 
00019 {
00025 
00031   template <typename T>
00032   class TBox3
00033   {
00034     public:
00035 
00036     BALL_CREATE(TBox3<T>)
00037 
00038     
00041 
00044     TBox3();
00045 
00049     TBox3(const TBox3& box);
00050 
00057     TBox3(const TVector3<T>& point, 
00058           const TVector3<T>& right_vector,
00059           const TVector3<T>& height_vector,
00060           const T& depth = 1);
00061     
00068     TBox3(const TVector3<T>& point, 
00069           const TVector3<T>& right_vector  = TVector3<T>((T) 0, (T)1, (T)0),
00070           const TVector3<T>& height_vector = TVector3<T>((T) 1, (T)0, (T)0),
00071           const TVector3<T>& depth_vector  = TVector3<T>((T) 0, (T)0, (T)1));
00072     
00075     virtual ~TBox3()
00076     {
00077     }
00078 
00082     virtual void clear();
00083 
00085 
00087 
00091     void set(const TBox3& box);
00092 
00097     const TBox3& operator = (const TBox3& box);
00098 
00102     void swap(TBox3& box);
00103 
00105 
00107     
00109     void setWidth(T width);
00110 
00112     T getWidth() const { return width_;}
00113 
00115     void setHeight(T height);
00116     
00118     T getHeight() const { return height_;}
00119 
00121     void setDepth(T depth);
00122 
00124     T getDepth() const { return depth_;}
00125 
00127     const TVector3<T>& getPoint() const { return point_;}
00128 
00130     void setPoint(const TVector3<T>& point)  { point_ = point;}
00131 
00133     const TVector3<T>& getRightVector() const { return right_vector_;}
00134 
00136     void setRightVector(const TVector3<T>& v);
00137 
00139     const TVector3<T>& getHeightVector() const { return height_vector_;}
00140     
00142     void setHeightVector(const TVector3<T>& v);
00143     
00145     const TVector3<T>& getDepthVector() const
00146       { return depth_vector_;}
00147     
00149     void setDepthVector(const TVector3<T>& v);
00150     
00154     T getSurface() const;
00155 
00159     T getVolume() const;
00160 
00162     TVector3<T> getDiagonalVector() const;
00163 
00165 
00167 
00171     bool operator == (const TBox3& box) const;
00172 
00176     bool operator != (const TBox3& box) const;
00177 
00178     /*  Test if a given point is a member of the box.
00179         Optional it can be testet, if the point lies on the surface.
00180         @param point the point to be tested
00181         @param on_surface true to test the surface (default = false)
00182         @return bool, <b>true</b> or <b>false</b>
00183     */
00184     //bool has(const TVector3<T>& point, bool on_surface = false) const;
00185 
00186     /*  Test if two boxes intersect.
00187         @param box the box to be tested
00188         @return bool, <b>true</b> if the two boxes are intersecting, <b>false</b> otherwise
00189     */
00190     //bool isIntersecting(const TBox3& box) const;
00191   
00193 
00195 
00200     bool isValid() const;
00201 
00208     void dump(std::ostream& s = std::cout, Size depth = 0) const;
00210 
00211     protected:
00212 
00213     //_ lower left point of the box.
00214     TVector3<T> point_;
00215     TVector3<T> right_vector_;
00216     TVector3<T> height_vector_;
00217     TVector3<T> depth_vector_;
00218 
00219     T width_;
00220     T height_;
00221     T depth_;
00222   };
00224 
00225 
00226   template <typename T>
00227   TBox3<T>::TBox3(const TVector3<T>& point, const TVector3<T>& right_vector,const TVector3<T>& height_vector,const T& depth)
00228     : point_(point),
00229       right_vector_(right_vector),
00230       height_vector_(height_vector),
00231       depth_vector_((right_vector % height_vector).normalize() * depth),
00232       width_(right_vector.getLength()),
00233       height_(height_vector.getLength()),
00234       depth_(depth)
00235   {}
00236   
00237   template <typename T>
00238   TBox3<T>::TBox3(const TVector3<T>& point, 
00239                   const TVector3<T>& right_vector,
00240                   const TVector3<T>& height_vector,
00241                   const TVector3<T>& depth_vector)
00242     : point_(point),
00243       right_vector_(right_vector),
00244       height_vector_(height_vector),
00245       depth_vector_(depth_vector),
00246       width_(right_vector.getLength()),
00247       height_(height_vector.getLength()),
00248       depth_(depth_vector.getLength())
00249   {}
00250   
00251   template <typename T>
00252   TBox3<T>::TBox3()
00253     : point_((T)0, (T)0, (T)0),
00254       right_vector_((T)0, (T)1, (T)0),
00255       height_vector_((T)1, (T)0, (T)0),
00256       depth_vector_((T)0, (T)0, (T)1),
00257       width_((T)1),
00258       height_((T)1),
00259       depth_((T)1)
00260   {
00261   }
00262 
00263   template <typename T>
00264   TBox3<T>::TBox3(const TBox3<T>& box)
00265     : point_(box.point_),
00266       right_vector_(box.right_vector_),
00267       height_vector_(box.height_vector_),
00268       depth_vector_(box.depth_vector_),
00269       width_(box.width_),
00270       height_(box.height_),
00271       depth_(box.depth_)
00272   {
00273   }
00274 
00275   template <typename T>
00276   void TBox3<T>::set(const TBox3<T>& box)
00277   {
00278     point_ = box.point_;
00279     right_vector_ = box.right_vector_;
00280     height_vector_ = box.height_vector_;
00281     depth_vector_ = box.depth_vector_;
00282     width_ = box.width_;
00283     height_ = box.height_;
00284     depth_ = box.depth_;
00285   }
00286 
00287   template <typename T>
00288   BALL_INLINE
00289   const TBox3<T>& TBox3<T>::operator = (const TBox3<T> &box)
00290   {
00291     set(box);
00292     return *this;
00293   }
00294 
00295   template <typename T>
00296   void TBox3<T>::swap(TBox3<T>& box)
00297   {
00298     point_.swap(box.point_);
00299     right_vector_.swap(box.right_vector_);
00300     height_vector_.swap(box.height_vector_);
00301     depth_vector_.swap(box.depth_vector_);
00302 
00303     std::swap(width_, box.width_);
00304     std::swap(height_, box.height_);
00305     std::swap(depth_, box.depth_);
00306   }
00307 
00308   template <typename T>
00309   void TBox3<T>::clear()
00310   {
00311     point_.clear();
00312     right_vector_ = TVector3<T>((T)0, (T)1, (T)0);
00313     height_vector_ = TVector3<T>((T)-1, (T)0, (T)0);
00314     depth_vector_ = TVector3<T>((T)0, (T)0, (T)1);
00315     width_ = (T) 1;
00316     height_ = (T) 1;
00317     depth_  = (T) 1;
00318   }
00319   
00320 
00321   template <typename T>
00322   BALL_INLINE
00323   void TBox3<T>::setWidth(T width) 
00324   {
00325     right_vector_.normalize();
00326     right_vector_ *= width;
00327     width_ = width;
00328   }
00329 
00330   template <typename T>
00331   BALL_INLINE
00332   void TBox3<T>::setHeight(T height)
00333   {
00334     height_vector_.normalize();
00335     height_vector_ *= height;
00336     height_ = height;
00337   }
00338 
00339   template <typename T>
00340   BALL_INLINE
00341   void TBox3<T>::setDepth(T depth) 
00342   {
00343     depth_vector_.normalize();
00344     depth_vector_ *= depth;
00345     depth_ = depth;
00346   }
00347   
00348   template <typename T>
00349   BALL_INLINE
00350   void TBox3<T>::setRightVector(const TVector3<T>& v)
00351   {
00352     right_vector_ = v;
00353     width_ = right_vector_.getLength();
00354   }
00355 
00356   template <typename T>
00357   BALL_INLINE
00358   void TBox3<T>::setHeightVector(const TVector3<T>& v)
00359   {
00360     height_vector_ = v;
00361     height_ = height_vector_.getLength();
00362   }
00363   
00364   template <typename T>
00365   BALL_INLINE
00366   void TBox3<T>::setDepthVector(const TVector3<T>& v)
00367   {
00368     depth_vector_ = v;
00369     depth_ = depth_vector_.getLength();
00370   }
00371   
00372   template <typename T>
00373   BALL_INLINE 
00374   T TBox3<T>::getSurface() const
00375   {
00376     return ((width_  * height_ + width_  * depth_  + height_ * depth_) * 2);
00377   }
00378   
00379   template <typename T>
00380   TVector3<T> TBox3<T>::getDiagonalVector() const
00381   {
00382     return (right_vector_ + height_vector_ + depth_vector_);
00383   }
00384 
00385   template <typename T>
00386   BALL_INLINE 
00387   T TBox3<T>::getVolume() const
00388   {
00389     return (width_ * height_ * depth_);
00390   }
00391 
00392   template <typename T>
00393   bool TBox3<T>::operator == (const TBox3<T>& box) const
00394   {
00395     return (point_          == box.point_           &&
00396             right_vector_   == box.right_vector_    &&
00397             height_vector_  == box.height_vector_   &&
00398             depth_vector_   == box.depth_vector_    &&
00399             width_          == box.width_           &&
00400             height_         == box.height_          &&
00401             depth_          == box.depth_);
00402   }
00403 
00404   template <typename T>
00405   BALL_INLINE 
00406   bool TBox3<T>::operator != (const TBox3<T> &box) const
00407   {
00408     return !(*this == box);
00409   }
00410 
00411   template <typename T>
00412   BALL_INLINE 
00413   bool TBox3<T>::isValid() const
00414   {
00415     return (point_.isValid() && 
00416             right_vector_.isValid() &&
00417             height_vector_.isValid() &&
00418             depth_vector_.isValid() &&
00419             !right_vector_.isZero() &&
00420             !height_vector_.isZero() && 
00421             !depth_vector_.isZero());
00422             
00423   }
00424 
00425   template <typename T>
00426   void TBox3<T>::dump(std::ostream& s, Size depth) const
00427   {
00428     BALL_DUMP_STREAM_PREFIX(s);
00429     
00430     BALL_DUMP_HEADER(s, this, this);
00431     
00432     BALL_DUMP_DEPTH(s, depth);
00433     s << "point: " << point_ << std::endl;
00434     
00435     BALL_DUMP_DEPTH(s, depth);
00436     s << "right_vector: " << right_vector_ << std::endl;
00437 
00438     BALL_DUMP_DEPTH(s, depth);
00439     s << "height_vector: " << height_vector_ << std::endl;
00440 
00441     BALL_DUMP_DEPTH(s, depth);
00442     s << "depth_vector: " << depth_vector_ << std::endl;
00443     
00444     BALL_DUMP_DEPTH(s, depth);
00445     s << "width: " << width_ << std::endl;
00446     
00447     BALL_DUMP_DEPTH(s, depth);
00448     s << "height: " << height_ << std::endl;
00449     
00450     BALL_DUMP_DEPTH(s, depth);
00451     s << "depth: " << depth_ << std::endl;
00452     
00453     BALL_DUMP_STREAM_SUFFIX(s);
00454   }
00455 
00463   template <typename T>
00464   std::istream& operator >> (std::istream& s, TBox3<T>& box)
00465   {
00466     TVector3<T> point, right, height, depth;
00467     s >> point >> right >> height >> depth;
00468     box.setPoint(point);
00469     box.setRightVector(right);
00470     box.setHeightVector(height);
00471     box.setDepthVector(depth);
00472     return s;
00473   }
00474 
00483   template <typename T>
00484   std::ostream& operator << (std::ostream& s, const TBox3<T>& box)
00485   {
00486     return s << box.getPoint() << " " 
00487              << box.getRightVector() << " " 
00488              << box.getHeightVector() << " " 
00489              << box.getDepthVector();
00490   }
00492 
00496   typedef TBox3<float> Box3;
00497 
00498 } // namespace BALL
00499 
00500 #endif // BALL_MATHS_BOX3_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines