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

FXRanged.h

Go to the documentation of this file.
00001 /********************************************************************************
00002 *                                                                               *
00003 *          D o u b l e - P r e c i s i o n    R a n g e    C l a s s            *
00004 *                                                                               *
00005 *********************************************************************************
00006 * Copyright (C) 2004,2009 by Jeroen van der Zijp.   All Rights Reserved.        *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or modify          *
00009 * it under the terms of the GNU Lesser General Public License as published by   *
00010 * the Free Software Foundation; either version 3 of the License, or             *
00011 * (at your option) any later version.                                           *
00012 *                                                                               *
00013 * This library is distributed in the hope that it will be useful,               *
00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                 *
00016 * GNU Lesser General Public License for more details.                           *
00017 *                                                                               *
00018 * You should have received a copy of the GNU Lesser General Public License      *
00019 * along with this program.  If not, see <http://www.gnu.org/licenses/>          *
00020 *********************************************************************************
00021 * $Id: FXRanged.h,v 1.25 2009/01/26 09:40:23 fox Exp $                          *
00022 ********************************************************************************/
00023 #ifndef FXRANGED_H
00024 #define FXRANGED_H
00025 
00026 
00027 namespace FX {
00028 
00029 
00030 class FXSphered;
00031 class FXMat4d;
00032 
00033 
00034 /// Bounds
00035 class FXAPI FXRanged {
00036 public:
00037   FXVec3d lower;
00038   FXVec3d upper;
00039 public:
00040 
00041   /// Default constructor; value is not initialized
00042   FXRanged(){}
00043 
00044   /// Initialize with another range
00045   FXRanged(const FXRanged& bounds):lower(bounds.lower),upper(bounds.upper){}
00046 
00047   /// Initialize with a single point
00048   FXRanged(const FXVec3d& p):lower(p),upper(p){}
00049 
00050   /// Initialize with corner points
00051   FXRanged(const FXVec3d& l,const FXVec3d& h):lower(l),upper(h){}
00052 
00053   /// Initialize with a single point
00054   FXRanged(FXdouble x,FXdouble y,FXdouble z):lower(x,y,z),upper(x,y,z){}
00055 
00056   /// Initialize with explicit values
00057   FXRanged(FXdouble xl,FXdouble xh,FXdouble yl,FXdouble yh,FXdouble zl,FXdouble zh):lower(xl,yl,zl),upper(xh,yh,zh){}
00058 
00059   /// Initialize box to fully contain the given bounding sphere
00060   FXRanged(const FXSphered& sphere);
00061 
00062   /// Assignment
00063   FXRanged& operator=(const FXRanged& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; }
00064 
00065   /// Set value from another range
00066   FXRanged& set(const FXRanged& bounds){ lower=bounds.lower; upper=bounds.upper; return *this; }
00067 
00068   /// Set value from single point
00069   FXRanged& set(const FXVec3d& p){ lower=upper=p; return *this; }
00070 
00071   /// Set value from corner points
00072   FXRanged& set(const FXVec3d& l,const FXVec3d& h){ lower=l; upper=h; return *this; }
00073 
00074   /// Set value from single point
00075   FXRanged& set(FXdouble x,FXdouble y,FXdouble z){ lower.x=upper.x=x; lower.y=upper.y=y; lower.z=upper.z=z; return *this; }
00076 
00077   /// Set value from explicit values
00078   FXRanged& set(FXdouble xl,FXdouble xh,FXdouble yl,FXdouble yh,FXdouble zl,FXdouble zh){ lower.set(xl,yl,zl); upper.set(xh,yh,zh); return *this; }
00079 
00080   /// Indexing with 0..1
00081   FXVec3d& operator[](FXint i){ return (&lower)[i]; }
00082 
00083   /// Indexing with 0..1
00084   const FXVec3d& operator[](FXint i) const { return (&lower)[i]; }
00085 
00086   /// Comparison
00087   FXbool operator==(const FXRanged& r) const { return lower==r.lower && upper==r.upper; }
00088   FXbool operator!=(const FXRanged& r) const { return lower!=r.lower || upper!=r.upper; }
00089 
00090   /// Width of box
00091   FXdouble width() const { return upper.x-lower.x; }
00092 
00093   /// Height of box
00094   FXdouble height() const { return upper.y-lower.y; }
00095 
00096   /// Depth of box
00097   FXdouble depth() const { return upper.z-lower.z; }
00098 
00099   /// Longest side
00100   FXdouble longest() const;
00101 
00102   /// shortest side
00103   FXdouble shortest() const;
00104 
00105   /// Length of diagonal
00106   FXdouble diameter() const;
00107 
00108   /// Get radius of box
00109   FXdouble radius() const;
00110 
00111   /// Compute diagonal
00112   FXVec3d diagonal() const;
00113 
00114   /// Get center of box
00115   FXVec3d center() const;
00116 
00117   /// Test if empty
00118   FXbool empty() const;
00119 
00120   /// Test if box contains point x,y,z
00121   FXbool contains(FXdouble x,FXdouble y,FXdouble z) const;
00122 
00123   /// Test if box contains point p
00124   FXbool contains(const FXVec3d& p) const;
00125 
00126   /// Test if box properly contains another box
00127   FXbool contains(const FXRanged& bounds) const;
00128 
00129   /// Test if box properly contains sphere
00130   FXbool contains(const FXSphered& sphere) const;
00131 
00132   /// Include point
00133   FXRanged& include(FXdouble x,FXdouble y,FXdouble z);
00134 
00135   /// Include point
00136   FXRanged& include(const FXVec3d& v);
00137 
00138   /// Include given range into box
00139   FXRanged& include(const FXRanged& box);
00140 
00141   /// Include given sphere into this box
00142   FXRanged& include(const FXSphered& sphere);
00143 
00144   /// Intersect box with normalized plane ax+by+cz+w; returns -1,0,+1
00145   FXint intersect(const FXVec4d &plane) const;
00146 
00147   /// Intersect box with ray u-v
00148   FXbool intersect(const FXVec3d& u,const FXVec3d& v);
00149 
00150   /// Test if bounds overlap
00151   friend FXAPI FXbool overlap(const FXRanged& a,const FXRanged& b);
00152 
00153   /// Get corner number 0..7
00154   FXVec3d corner(FXint c) const { return FXVec3d((&lower)[c&1].x, (&lower)[(c>>1)&1].y, (&lower)[c>>2].z); }
00155 
00156   /// Transform range by 4x4 matrix
00157   FXRanged transform(const FXMat4d& mat) const;
00158 
00159   /// Union of two boxes
00160   friend FXAPI FXRanged unite(const FXRanged& a,const FXRanged& b);
00161 
00162   /// Intersection of two boxes
00163   friend FXAPI FXRanged intersect(const FXRanged& a,const FXRanged& b);
00164 
00165   /// Save object to a stream
00166   friend FXAPI FXStream& operator<<(FXStream& store,const FXRanged& bounds);
00167 
00168   /// Load object from a stream
00169   friend FXAPI FXStream& operator>>(FXStream& store,FXRanged& bounds);
00170   };
00171 
00172 
00173 extern FXAPI FXbool overlap(const FXRanged& a,const FXRanged& b);
00174 
00175 extern FXAPI FXRanged unite(const FXRanged& a,const FXRanged& b);
00176 extern FXAPI FXRanged intersect(const FXRanged& a,const FXRanged& b);
00177 
00178 extern FXAPI FXStream& operator<<(FXStream& store,const FXRanged& bounds);
00179 extern FXAPI FXStream& operator>>(FXStream& store,FXRanged& bounds);
00180 
00181 }
00182 
00183 #endif
00184 

Copyright © 1997-2009 Jeroen van der Zijp