Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vec4.H

Go to the documentation of this file.
00001 #ifndef VEC4_H_IS_INCLUDED
00002 #define VEC4_H_IS_INCLUDED
00003 
00004 /*!
00005  *  \file Vec4.H
00006  *  \brief Contains the declaration of the Vec4 class, a 4D vector class.
00007  *  \ingroup group_MLIB
00008  *
00009  *  \libgfx This code has been taken almost verbatim from libgfx.  Though,
00010  *  the TVec4 template has been manually instanciated to use doubles.
00011  *
00012  */
00013 
00014 //#include "mlib/point3.H"
00015 #include "mlib/points.H"
00016 #include "mlib/vec3.H"
00017 #include "mlib/global.H"
00018 
00019 namespace mlib {
00020 
00021 /*!
00022  *  \brief A 4D vector class with double precision floating point elements.
00023  *  \ingroup group_MLIB
00024  *
00025  *  \libgfx This class has been taken almost verbatim from libgfx.
00026  *
00027  */
00028 class Vec4 {
00029    
00030    protected:
00031    
00032       double elt[4];
00033 
00034    public:
00035    
00036       //! \name Constructors
00037       //@{
00038       
00039       explicit Vec4(double s=0) { *this = s; }
00040       Vec4(double x, double y, double z, double w)
00041          { elt[0]=x; elt[1]=y; elt[2]=z; elt[3]=w; }
00042       
00043       template <typename V>
00044       Vec4(const Vec3<V> &v, double w = 0.0)
00045          { elt[0]=v[0];  elt[1]=v[1];  elt[2]=v[2];  elt[3]=w; }
00046          
00047       template <typename P>
00048       explicit Vec4(const P &p, double w = 1.0)
00049          { elt[0]=p[0]; elt[1]=p[1]; elt[2]=p[2]; elt[3]=w; }
00050          
00051       template <typename U>
00052       explicit Vec4(const U v[4])
00053          { elt[0]=v[0]; elt[1]=v[1]; elt[2]=v[2]; elt[3]=v[3]; }
00054          
00055       //@}
00056       
00057       Vec4& operator=(double s) { elt[0]=elt[1]=elt[2]=elt[3]=s; return *this; }
00058       
00059       //! \name Descriptive interface
00060       //@{
00061          
00062       typedef double value_type;
00063       static int dim() { return 4; }
00064       
00065       //@}      
00066       
00067       //! \name Element Access Functions
00068       //@{
00069          
00070       operator       double*()       { return elt; }
00071       operator const double*() const { return elt; }
00072 
00073 #ifndef HAVE_CASTING_LIMITS
00074 //      double& operator[](int i)       { return elt[i]; }
00075 //      double  operator[](int i) const { return elt[i]; }
00076 //      operator const double*()        { return elt; }
00077 #endif
00078 
00079       //@}
00080       
00081       //! \name Overloaded Mathematical Operators
00082       //@{
00083       
00084       Vec4& operator+=(const Vec4& v)
00085          { elt[0]+=v[0]; elt[1]+=v[1]; elt[2]+=v[2]; elt[3]+=v[3]; return *this; }
00086          
00087       Vec4& operator-=(const Vec4& v)
00088          { elt[0]-=v[0]; elt[1]-=v[1]; elt[2]-=v[2]; elt[3]-=v[3]; return *this; }
00089       
00090       Vec4& operator*=(double s)
00091          { elt[0] *= s; elt[1] *= s; elt[2] *= s; elt[3] *= s; return *this; }
00092       
00093       Vec4& operator/=(double s)
00094          { elt[0] /= s; elt[1] /= s; elt[2] /= s; elt[3] /= s; return *this; }
00095       
00096       Vec4 operator+(const Vec4 &v) const
00097          { return Vec4(elt[0]+v[0], elt[1]+v[1], elt[2]+v[2], elt[3]+v[3]); }
00098       
00099       Vec4 operator-(const Vec4& v) const
00100          { return Vec4(elt[0]-v[0], elt[1]-v[1], elt[2]-v[2], elt[3]-v[3]); }
00101       
00102       Vec4 operator-() const
00103          { return Vec4(-elt[0], -elt[1], -elt[2], -elt[3]); }
00104          
00105       Vec4 operator*(double s) const
00106          { return Vec4(elt[0]*s, elt[1]*s, elt[2]*s, elt[3]*s); }
00107       
00108       Vec4 operator/(double s) const
00109          { return Vec4(elt[0]/s, elt[1]/s, elt[2]/s, elt[3]/s); }
00110       
00111       //! \brief Dot product.
00112       double operator*(const Vec4 &v) const
00113          { return elt[0]*v[0] + elt[1]*v[1] + elt[2]*v[2] + elt[3]*v[3]; }
00114       
00115       friend Vec4 operator*(double s, const Vec4 &v)
00116          { return v*s; }
00117       
00118       //@}
00119       
00120       //! \name Vector Property Queries
00121       //@{
00122       
00123       double length() const
00124          { return sqrt(elt[0]*elt[0]+elt[1]*elt[1]+elt[2]*elt[2]+elt[3]*elt[3]); }
00125       double length_sqrd() const
00126          { return elt[0]*elt[0]+elt[1]*elt[1]+elt[2]*elt[2]+elt[3]*elt[3]; }
00127       double length_rect() const
00128          { return fabs(elt[0])+fabs(elt[1])+fabs(elt[2])+fabs(elt[3]); }
00129          
00130       //@}
00131       
00132       //! \name Two Vector Operations
00133       //@{
00134    
00135       double dist(const Vec4 &v) const
00136          { return ((*this)-v).length(); }
00137       double dist_sqrd(const Vec4 &v) const
00138          { return (*this-v).length_sqrd(); }
00139          
00140       //@}
00141       
00142       //! \name Single Vector Operations
00143       //@{
00144          
00145       Vec4 normalized() const
00146          { double l; return ((l = length()) > gEpsZeroMath) ?
00147             Vec4(elt[0]/l, elt[1]/l, elt[2]/l, elt[3]/l) : Vec4(); }
00148       
00149       //@}
00150 
00151 };
00152 
00153 ////////////////////////////////////////////////////////////////////////
00154 //
00155 // Operator definitions
00156 //
00157 
00158 //! \relates Vec4
00159 std::ostream &operator<<(std::ostream &out, const Vec4& v);
00160 
00161 //! \relates Vec4
00162 std::istream &operator>>(std::istream &in, Vec4& v);
00163 
00164 ////////////////////////////////////////////////////////////////////////
00165 //
00166 // Misc. function definitions
00167 //
00168 
00169 //! \relates Vec4
00170 Vec4 cross(const Vec4& a, const Vec4& b, const Vec4& c);
00171 
00172 //! \brief Projects a Vec4 
00173 //! \relates Vec4
00174 Vec3<Wvec> proj(const Vec4& v);
00175 
00176 } // namespace mlib
00177 
00178 #endif // VEC4_H_IS_INCLUDED

Generated on Mon Sep 18 11:39:34 2006 for jot by  doxygen 1.4.4