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

AltStyle によって変換されたページ (->オリジナル) /