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

Vec4.h

Go to the documentation of this file.
00001 /*
00002     File:           Vec4.h
00003 
00004     Function:       Defines a length-4 vector.
00005                     
00006     Author(s):      Andrew Willmott
00007 
00008     Copyright:      (c) 1995-2000, Andrew Willmott
00009  */
00010 
00011 #ifndef __Vec4__
00012 #define __Vec4__
00013 
00014 #include "vl/VL.h"
00015 // Defines the actual type for TVec4 etc.
00016 
00017 
00018 // --- Vec4 Class -------------------------------------------------------------
00019 
00020 
00021 class TVec3;
00022 
00023 class TVec4
00024 {
00025 public:
00026 
00027     // Constructors
00028     
00029     inline      TVec4();
00030     inline      TVec4(TVReal x, TVReal y, TVReal z, TVReal w);  // [x, y, z, w]
00031     inline      TVec4(const TVec4 &v);                      // Copy constructor
00032     inline      TVec4(const TVec3 &v, TVReal w);            // Hom. 3D vector
00033     inline      TVec4(ZeroOrOne k);                     
00034     inline      TVec4(Axis k);                      
00035     
00036     // Accessor functions
00037     
00038     inline Int          Elts() const { return(4); };
00039     
00040     inline TVReal       &operator [] (Int i);           
00041     inline const TVReal &operator [] (Int i) const;                   
00042 
00043     inline TVReal       *Ref() const;                   // Return pointer to data
00044 
00045     // Assignment operators
00046     
00047     inline TVec4        &operator =  (const TVec4 &a);  
00048     inline TVec4        &operator =  (ZeroOrOne k);
00049     inline TVec4        &operator =  (Axis k);
00050     inline TVec4        &operator += (const TVec4 &a);
00051     inline TVec4        &operator -= (const TVec4 &a);
00052     inline TVec4        &operator *= (const TVec4 &a);
00053     inline TVec4        &operator *= (TVReal s);
00054     inline TVec4        &operator /= (const TVec4 &a);
00055     inline TVec4        &operator /= (TVReal s);
00056     
00057     // Comparison operators
00058 
00059     Bool                operator == (const TVec4 &a) const; // v == a ?
00060     Bool                operator != (const TVec4 &a) const; // v != a ?
00061 
00062     // Arithmetic operators
00063         
00064     inline TVec4        operator + (const TVec4 &a) const;  // v + a
00065     inline TVec4        operator - (const TVec4 &a) const;  // v - a
00066     inline TVec4        operator - () const;                // -v
00067     inline TVec4        operator * (const TVec4 &a) const;  // v * a (vx * ax, ...)
00068     inline TVec4        operator * (TVReal s) const;        // v * s
00069     inline TVec4        operator / (const TVec4 &a) const;  // v / a (vx / ax, ...)
00070     inline TVec4        operator / (TVReal s) const;        // v / s
00071 
00072     
00073     // Initialisers
00074     
00075     inline TVec4        &MakeZero();                        // Zero vector
00076     TVec4               &MakeUnit(Int i, TVReal k = vl_one);// kI[i]
00077     inline TVec4        &MakeBlock(TVReal k = vl_one);      // All-k vector
00078 
00079     inline TVec4        &Normalise();                       // normalise vector
00080 
00081     // Private...
00082 
00083 protected:  
00084     
00085     TVReal elt[4]; 
00086 };
00087 
00088 
00089 // --- Vec operators ----------------------------------------------------------
00090 
00091 inline TVec4    operator * (TVReal s, const TVec4 &v);// Left mult. by s
00092 inline TVReal   dot(const TVec4 &a, const TVec4 &b);// v . a    
00093 inline TVReal   len(const TVec4 &v);                // || v ||
00094 inline TVReal   sqrlen(const TVec4 &v);             // v . v
00095 inline TVec4    norm(const TVec4 &v);               // v / || v ||
00096 inline Void     normalise(TVec4 &v);                // v = norm(v)
00097 TVec4           cross(const TVec4 &a, const TVec4 &b, const TVec4 &c);
00098                                                     // 4D cross prod.
00099 TVec3           proj(const TVec4 &v);               // hom. projection
00100 
00101 ostream &operator << (ostream &s, const TVec4 &v);
00102 istream &operator >> (istream &s, TVec4 &v);
00103     
00104 
00105 // --- Inlines ----------------------------------------------------------------
00106 
00107 
00108 #include "vl/Vec3.h"
00109 
00110 inline TVReal &TVec4::operator [] (Int i)
00111 {
00112     CheckRange(i, 0, 4, "(Vec4::[i]) index out of range");
00113     return(elt[i]);
00114 }
00115 
00116 inline const TVReal &TVec4::operator [] (Int i) const
00117 {
00118     CheckRange(i, 0, 4, "(Vec4::[i]) index out of range");
00119     return(elt[i]);
00120 }
00121 
00122 
00123 inline TVec4::TVec4()
00124 {
00125 }
00126 
00127 inline TVec4::TVec4(TVReal x, TVReal y, TVReal z, TVReal w)
00128 {
00129     elt[0] = x;
00130     elt[1] = y;
00131     elt[2] = z;
00132     elt[3] = w;
00133 }
00134 
00135 inline TVec4::TVec4(const TVec4 &v) 
00136 {
00137     elt[0] = v[0];
00138     elt[1] = v[1];
00139     elt[2] = v[2];
00140     elt[3] = v[3];
00141 }
00142 
00143 inline TVec4::TVec4(const TVec3 &v, TVReal w)   
00144 {
00145     elt[0] = v[0];
00146     elt[1] = v[1];
00147     elt[2] = v[2];
00148     elt[3] = w;
00149 }
00150 
00151 inline TVReal *TVec4::Ref() const
00152 {
00153     return((TVReal *) elt);
00154 }
00155 
00156 inline TVec4 &TVec4::operator = (const TVec4 &v)
00157 {
00158     elt[0] = v[0];
00159     elt[1] = v[1];
00160     elt[2] = v[2];
00161     elt[3] = v[3];
00162     
00163     return(SELF);
00164 }
00165 
00166 inline TVec4 &TVec4::operator += (const TVec4 &v)
00167 {
00168     elt[0] += v[0];
00169     elt[1] += v[1];
00170     elt[2] += v[2];
00171     elt[3] += v[3];
00172     
00173     return(SELF);
00174 }
00175 
00176 inline TVec4 &TVec4::operator -= (const TVec4 &v)
00177 {
00178     elt[0] -= v[0];
00179     elt[1] -= v[1];
00180     elt[2] -= v[2];
00181     elt[3] -= v[3];
00182     
00183     return(SELF);
00184 }
00185 
00186 inline TVec4 &TVec4::operator *= (const TVec4 &v)
00187 {
00188     elt[0] *= v[0];
00189     elt[1] *= v[1];
00190     elt[2] *= v[2];
00191     elt[3] *= v[3];
00192     
00193     return(SELF);
00194 }
00195 
00196 inline TVec4 &TVec4::operator *= (TVReal s)
00197 {
00198     elt[0] *= s;
00199     elt[1] *= s;
00200     elt[2] *= s;
00201     elt[3] *= s;
00202     
00203     return(SELF);
00204 }
00205 
00206 inline TVec4 &TVec4::operator /= (const TVec4 &v)
00207 {
00208     elt[0] /= v[0];
00209     elt[1] /= v[1];
00210     elt[2] /= v[2];
00211     elt[3] /= v[3];
00212     
00213     return(SELF);
00214 }
00215 
00216 inline TVec4 &TVec4::operator /= (TVReal s)
00217 {
00218     elt[0] /= s;
00219     elt[1] /= s;
00220     elt[2] /= s;
00221     elt[3] /= s;
00222     
00223     return(SELF);
00224 }
00225 
00226 
00227 inline TVec4 TVec4::operator + (const TVec4 &a) const
00228 {
00229     TVec4 result;
00230     
00231     result[0] = elt[0] + a[0];
00232     result[1] = elt[1] + a[1];
00233     result[2] = elt[2] + a[2];
00234     result[3] = elt[3] + a[3];
00235     
00236     return(result);
00237 }
00238 
00239 inline TVec4 TVec4::operator - (const TVec4 &a) const
00240 {
00241     TVec4 result;
00242     
00243     result[0] = elt[0] - a[0];
00244     result[1] = elt[1] - a[1];
00245     result[2] = elt[2] - a[2];
00246     result[3] = elt[3] - a[3];
00247     
00248     return(result);
00249 }
00250 
00251 inline TVec4 TVec4::operator - () const
00252 {
00253     TVec4 result;
00254     
00255     result[0] = -elt[0];
00256     result[1] = -elt[1];
00257     result[2] = -elt[2];
00258     result[3] = -elt[3];
00259     
00260     return(result);
00261 }
00262 
00263 inline TVec4 TVec4::operator * (const TVec4 &a) const           
00264 {
00265     TVec4 result;
00266 
00267     result[0] = elt[0] * a[0];
00268     result[1] = elt[1] * a[1];
00269     result[2] = elt[2] * a[2];
00270     result[3] = elt[3] * a[3];
00271     
00272     return(result);
00273 }
00274 
00275 inline TVec4 TVec4::operator * (TVReal s) const
00276 {
00277     TVec4 result;
00278     
00279     result[0] = elt[0] * s;
00280     result[1] = elt[1] * s;
00281     result[2] = elt[2] * s;
00282     result[3] = elt[3] * s;
00283     
00284     return(result);
00285 }
00286 
00287 inline TVec4 TVec4::operator / (const TVec4 &a) const
00288 {
00289     TVec4 result;
00290     
00291     result[0] = elt[0] / a[0];
00292     result[1] = elt[1] / a[1];
00293     result[2] = elt[2] / a[2];
00294     result[3] = elt[3] / a[3];
00295     
00296     return(result);
00297 }
00298 
00299 inline TVec4 TVec4::operator / (TVReal s) const
00300 {
00301     TVec4 result;
00302     
00303     result[0] = elt[0] / s;
00304     result[1] = elt[1] / s;
00305     result[2] = elt[2] / s;
00306     result[3] = elt[3] / s;
00307     
00308     return(result);
00309 }
00310 
00311 inline TVec4 operator * (TVReal s, const TVec4 &v)
00312 {
00313     return(v * s);
00314 }
00315 
00316 inline TVec4 &TVec4::MakeZero()
00317 {
00318     elt[0] = vl_zero; elt[1] = vl_zero; elt[2] = vl_zero; elt[3] = vl_zero;
00319     return(SELF);
00320 }
00321 
00322 inline TVec4 &TVec4::MakeBlock(TVReal k)
00323 {
00324     elt[0] = k; elt[1] = k; elt[2] = k; elt[3] = k;
00325     return(SELF);
00326 }
00327 
00328 inline TVec4 &TVec4::Normalise()
00329 {
00330     Assert(sqrlen(SELF) > 0.0, "normalising length-zero vector");
00331     SELF /= len(SELF);
00332     return(SELF);
00333 }
00334 
00335 inline TVec4::TVec4(ZeroOrOne k)    
00336 {
00337     MakeBlock(k);
00338 }
00339 
00340 inline TVec4::TVec4(Axis k)     
00341 {
00342     MakeUnit(k, vl_1);
00343 }
00344 
00345 inline TVec4 &TVec4::operator = (ZeroOrOne k)
00346 {
00347     MakeBlock(k);
00348     
00349     return(SELF);
00350 }
00351 
00352 inline TVec4 &TVec4::operator = (Axis k)
00353 {
00354     MakeUnit(k, vl_1);
00355     
00356     return(SELF);
00357 }
00358 
00359 
00360 inline TVReal dot(const TVec4 &a, const TVec4 &b)
00361 {
00362     return(a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]);
00363 }
00364 
00365 inline TVReal len(const TVec4 &v)
00366 {
00367     return(sqrt(dot(v, v)));
00368 }
00369 
00370 inline TVReal sqrlen(const TVec4 &v)
00371 {
00372     return(dot(v, v));
00373 }
00374 
00375 inline TVec4 norm(const TVec4 &v)   
00376 {
00377     Assert(sqrlen(v) > 0.0, "normalising length-zero vector");
00378     return(v / len(v));
00379 }
00380 
00381 inline Void normalise(TVec4 &v) 
00382 {
00383     v /= len(v);
00384 }
00385 
00386 
00387 #endif

Generated at Sat Aug 5 00:16:49 2000 for Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000