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

Vec2.h

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