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

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