Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

Committer:
BartJanssens
Date:
Mon Jan 04 15:19:10 2016 +0000
Revision:
0:785cff1e5a7c
svl-1.5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:785cff1e5a7c 1 /*
BartJanssens 0:785cff1e5a7c 2 File: Vec3.h
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Defines a length-3 vector.
BartJanssens 0:785cff1e5a7c 5
BartJanssens 0:785cff1e5a7c 6 Author(s): Andrew Willmott
BartJanssens 0:785cff1e5a7c 7
BartJanssens 0:785cff1e5a7c 8 Copyright: (c) 1995-2001, Andrew Willmott
BartJanssens 0:785cff1e5a7c 9 */
BartJanssens 0:785cff1e5a7c 10
BartJanssens 0:785cff1e5a7c 11 #ifndef __Vec3__
BartJanssens 0:785cff1e5a7c 12 #define __Vec3__
BartJanssens 0:785cff1e5a7c 13
BartJanssens 0:785cff1e5a7c 14 #include "Vec2.h"
BartJanssens 0:785cff1e5a7c 15
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17 // --- Vec3 Class -------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 18
BartJanssens 0:785cff1e5a7c 19 class Vec3
BartJanssens 0:785cff1e5a7c 20 {
BartJanssens 0:785cff1e5a7c 21 public:
BartJanssens 0:785cff1e5a7c 22
BartJanssens 0:785cff1e5a7c 23 // Constructors
BartJanssens 0:785cff1e5a7c 24
BartJanssens 0:785cff1e5a7c 25 Vec3();
BartJanssens 0:785cff1e5a7c 26 Vec3(double x, double y, double z); // [x, y, z]
BartJanssens 0:785cff1e5a7c 27 Vec3(const Vec3 &v); // Copy constructor
BartJanssens 0:785cff1e5a7c 28 Vec3(const Vec2 &v, double w); // Hom. 2D vector
BartJanssens 0:785cff1e5a7c 29 Vec3(ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 30 Vec3(Axis a);
BartJanssens 0:785cff1e5a7c 31
BartJanssens 0:785cff1e5a7c 32 // Accessor functions
BartJanssens 0:785cff1e5a7c 33
BartJanssens 0:785cff1e5a7c 34 Int Elts() const { return(3); };
BartJanssens 0:785cff1e5a7c 35
BartJanssens 0:785cff1e5a7c 36 double &operator [] (Int i);
BartJanssens 0:785cff1e5a7c 37 const double &operator [] (Int i) const;
BartJanssens 0:785cff1e5a7c 38
BartJanssens 0:785cff1e5a7c 39 double *Ref() const; // Return pointer to data
BartJanssens 0:785cff1e5a7c 40
BartJanssens 0:785cff1e5a7c 41 // Assignment operators
BartJanssens 0:785cff1e5a7c 42
BartJanssens 0:785cff1e5a7c 43 Vec3 &operator = (const Vec3 &a);
BartJanssens 0:785cff1e5a7c 44 Vec3 &operator = (ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 45 Vec3 &operator += (const Vec3 &a);
BartJanssens 0:785cff1e5a7c 46 Vec3 &operator -= (const Vec3 &a);
BartJanssens 0:785cff1e5a7c 47 Vec3 &operator *= (const Vec3 &a);
BartJanssens 0:785cff1e5a7c 48 Vec3 &operator *= (double s);
BartJanssens 0:785cff1e5a7c 49 Vec3 &operator /= (const Vec3 &a);
BartJanssens 0:785cff1e5a7c 50 Vec3 &operator /= (double s);
BartJanssens 0:785cff1e5a7c 51
BartJanssens 0:785cff1e5a7c 52 // Comparison operators
BartJanssens 0:785cff1e5a7c 53
BartJanssens 0:785cff1e5a7c 54 Bool operator == (const Vec3 &a) const; // v == a?
BartJanssens 0:785cff1e5a7c 55 Bool operator != (const Vec3 &a) const; // v != a?
BartJanssens 0:785cff1e5a7c 56 Bool operator < (const Vec3 &a) const; // v < a?
BartJanssens 0:785cff1e5a7c 57 Bool operator >= (const Vec3 &a) const; // v >= a?
BartJanssens 0:785cff1e5a7c 58
BartJanssens 0:785cff1e5a7c 59 // Arithmetic operators
BartJanssens 0:785cff1e5a7c 60
BartJanssens 0:785cff1e5a7c 61 Vec3 operator + (const Vec3 &a) const; // v + a
BartJanssens 0:785cff1e5a7c 62 Vec3 operator - (const Vec3 &a) const; // v - a
BartJanssens 0:785cff1e5a7c 63 Vec3 operator - () const; // -v
BartJanssens 0:785cff1e5a7c 64 Vec3 operator * (const Vec3 &a) const; // v * a (vx * ax, ...)
BartJanssens 0:785cff1e5a7c 65 Vec3 operator * (double s) const; // v * s
BartJanssens 0:785cff1e5a7c 66 Vec3 operator / (const Vec3 &a) const; // v / a (vx / ax, ...)
BartJanssens 0:785cff1e5a7c 67 Vec3 operator / (double s) const; // v / s
BartJanssens 0:785cff1e5a7c 68
BartJanssens 0:785cff1e5a7c 69 // Initialisers
BartJanssens 0:785cff1e5a7c 70
BartJanssens 0:785cff1e5a7c 71 Vec3 &MakeZero(); // Zero vector
BartJanssens 0:785cff1e5a7c 72 Vec3 &MakeUnit(Int i, double k = vl_one); // I[i]
BartJanssens 0:785cff1e5a7c 73 Vec3 &MakeBlock(double k = vl_one); // All-k vector
BartJanssens 0:785cff1e5a7c 74
BartJanssens 0:785cff1e5a7c 75 Vec3 &Normalise(); // normalise vector
BartJanssens 0:785cff1e5a7c 76
BartJanssens 0:785cff1e5a7c 77 // Private...
BartJanssens 0:785cff1e5a7c 78
BartJanssens 0:785cff1e5a7c 79 protected:
BartJanssens 0:785cff1e5a7c 80
BartJanssens 0:785cff1e5a7c 81 double elt[3];
BartJanssens 0:785cff1e5a7c 82 };
BartJanssens 0:785cff1e5a7c 83
BartJanssens 0:785cff1e5a7c 84
BartJanssens 0:785cff1e5a7c 85 // --- Vec operators ----------------------------------------------------------
BartJanssens 0:785cff1e5a7c 86
BartJanssens 0:785cff1e5a7c 87 inline Vec3 operator * (double s, const Vec3 &v); // s * v
BartJanssens 0:785cff1e5a7c 88 inline double dot(const Vec3 &a, const Vec3 &b); // v . a
BartJanssens 0:785cff1e5a7c 89 inline double len(const Vec3 &v); // || v ||
BartJanssens 0:785cff1e5a7c 90 inline double sqrlen(const Vec3 &v); // v . v
BartJanssens 0:785cff1e5a7c 91 inline Vec3 norm(const Vec3 &v); // v / || v ||
BartJanssens 0:785cff1e5a7c 92 inline Void normalise(Vec3 &v); // v = norm(v)
BartJanssens 0:785cff1e5a7c 93 inline Vec3 cross(const Vec3 &a, const Vec3 &b);// a x b
BartJanssens 0:785cff1e5a7c 94 inline Vec2 proj(const Vec3 &v); // hom. projection
BartJanssens 0:785cff1e5a7c 95
BartJanssens 0:785cff1e5a7c 96 //std::ostream &operator << (std::ostream &s, const Vec3 &v);
BartJanssens 0:785cff1e5a7c 97 //std::istream &operator >> (std::istream &s, Vec3 &v);
BartJanssens 0:785cff1e5a7c 98
BartJanssens 0:785cff1e5a7c 99 inline void printVec3(const Vec3 &v);
BartJanssens 0:785cff1e5a7c 100
BartJanssens 0:785cff1e5a7c 101
BartJanssens 0:785cff1e5a7c 102 // --- Inlines ----------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 103
BartJanssens 0:785cff1e5a7c 104 inline double &Vec3::operator [] (Int i)
BartJanssens 0:785cff1e5a7c 105 {
BartJanssens 0:785cff1e5a7c 106 CheckRange(i, 0, 3, "(Vec3::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 107 return(elt[i]);
BartJanssens 0:785cff1e5a7c 108 }
BartJanssens 0:785cff1e5a7c 109
BartJanssens 0:785cff1e5a7c 110 inline const double &Vec3::operator [] (Int i) const
BartJanssens 0:785cff1e5a7c 111 {
BartJanssens 0:785cff1e5a7c 112 CheckRange(i, 0, 3, "(Vec3::[i]) index out of range");
BartJanssens 0:785cff1e5a7c 113 return(elt[i]);
BartJanssens 0:785cff1e5a7c 114 }
BartJanssens 0:785cff1e5a7c 115
BartJanssens 0:785cff1e5a7c 116 inline Vec3::Vec3()
BartJanssens 0:785cff1e5a7c 117 {
BartJanssens 0:785cff1e5a7c 118 }
BartJanssens 0:785cff1e5a7c 119
BartJanssens 0:785cff1e5a7c 120 inline Vec3::Vec3(double x, double y, double z)
BartJanssens 0:785cff1e5a7c 121 {
BartJanssens 0:785cff1e5a7c 122 elt[0] = x;
BartJanssens 0:785cff1e5a7c 123 elt[1] = y;
BartJanssens 0:785cff1e5a7c 124 elt[2] = z;
BartJanssens 0:785cff1e5a7c 125 }
BartJanssens 0:785cff1e5a7c 126
BartJanssens 0:785cff1e5a7c 127 inline Vec3::Vec3(const Vec3 &v)
BartJanssens 0:785cff1e5a7c 128 {
BartJanssens 0:785cff1e5a7c 129 elt[0] = v[0];
BartJanssens 0:785cff1e5a7c 130 elt[1] = v[1];
BartJanssens 0:785cff1e5a7c 131 elt[2] = v[2];
BartJanssens 0:785cff1e5a7c 132 }
BartJanssens 0:785cff1e5a7c 133
BartJanssens 0:785cff1e5a7c 134 inline Vec3::Vec3(const Vec2 &v, double w)
BartJanssens 0:785cff1e5a7c 135 {
BartJanssens 0:785cff1e5a7c 136 elt[0] = v[0];
BartJanssens 0:785cff1e5a7c 137 elt[1] = v[1];
BartJanssens 0:785cff1e5a7c 138 elt[2] = w;
BartJanssens 0:785cff1e5a7c 139 }
BartJanssens 0:785cff1e5a7c 140
BartJanssens 0:785cff1e5a7c 141 inline double *Vec3::Ref() const
BartJanssens 0:785cff1e5a7c 142 {
BartJanssens 0:785cff1e5a7c 143 return((double *) elt);
BartJanssens 0:785cff1e5a7c 144 }
BartJanssens 0:785cff1e5a7c 145
BartJanssens 0:785cff1e5a7c 146 inline Vec3 &Vec3::operator = (const Vec3 &v)
BartJanssens 0:785cff1e5a7c 147 {
BartJanssens 0:785cff1e5a7c 148 elt[0] = v[0];
BartJanssens 0:785cff1e5a7c 149 elt[1] = v[1];
BartJanssens 0:785cff1e5a7c 150 elt[2] = v[2];
BartJanssens 0:785cff1e5a7c 151
BartJanssens 0:785cff1e5a7c 152 return(SELF);
BartJanssens 0:785cff1e5a7c 153 }
BartJanssens 0:785cff1e5a7c 154
BartJanssens 0:785cff1e5a7c 155 inline Vec3 &Vec3::operator += (const Vec3 &v)
BartJanssens 0:785cff1e5a7c 156 {
BartJanssens 0:785cff1e5a7c 157 elt[0] += v[0];
BartJanssens 0:785cff1e5a7c 158 elt[1] += v[1];
BartJanssens 0:785cff1e5a7c 159 elt[2] += v[2];
BartJanssens 0:785cff1e5a7c 160
BartJanssens 0:785cff1e5a7c 161 return(SELF);
BartJanssens 0:785cff1e5a7c 162 }
BartJanssens 0:785cff1e5a7c 163
BartJanssens 0:785cff1e5a7c 164 inline Vec3 &Vec3::operator -= (const Vec3 &v)
BartJanssens 0:785cff1e5a7c 165 {
BartJanssens 0:785cff1e5a7c 166 elt[0] -= v[0];
BartJanssens 0:785cff1e5a7c 167 elt[1] -= v[1];
BartJanssens 0:785cff1e5a7c 168 elt[2] -= v[2];
BartJanssens 0:785cff1e5a7c 169
BartJanssens 0:785cff1e5a7c 170 return(SELF);
BartJanssens 0:785cff1e5a7c 171 }
BartJanssens 0:785cff1e5a7c 172
BartJanssens 0:785cff1e5a7c 173 inline Vec3 &Vec3::operator *= (const Vec3 &a)
BartJanssens 0:785cff1e5a7c 174 {
BartJanssens 0:785cff1e5a7c 175 elt[0] *= a[0];
BartJanssens 0:785cff1e5a7c 176 elt[1] *= a[1];
BartJanssens 0:785cff1e5a7c 177 elt[2] *= a[2];
BartJanssens 0:785cff1e5a7c 178
BartJanssens 0:785cff1e5a7c 179 return(SELF);
BartJanssens 0:785cff1e5a7c 180 }
BartJanssens 0:785cff1e5a7c 181
BartJanssens 0:785cff1e5a7c 182 inline Vec3 &Vec3::operator *= (double s)
BartJanssens 0:785cff1e5a7c 183 {
BartJanssens 0:785cff1e5a7c 184 elt[0] *= s;
BartJanssens 0:785cff1e5a7c 185 elt[1] *= s;
BartJanssens 0:785cff1e5a7c 186 elt[2] *= s;
BartJanssens 0:785cff1e5a7c 187
BartJanssens 0:785cff1e5a7c 188 return(SELF);
BartJanssens 0:785cff1e5a7c 189 }
BartJanssens 0:785cff1e5a7c 190
BartJanssens 0:785cff1e5a7c 191 inline Vec3 &Vec3::operator /= (const Vec3 &a)
BartJanssens 0:785cff1e5a7c 192 {
BartJanssens 0:785cff1e5a7c 193 elt[0] /= a[0];
BartJanssens 0:785cff1e5a7c 194 elt[1] /= a[1];
BartJanssens 0:785cff1e5a7c 195 elt[2] /= a[2];
BartJanssens 0:785cff1e5a7c 196
BartJanssens 0:785cff1e5a7c 197 return(SELF);
BartJanssens 0:785cff1e5a7c 198 }
BartJanssens 0:785cff1e5a7c 199
BartJanssens 0:785cff1e5a7c 200 inline Vec3 &Vec3::operator /= (double s)
BartJanssens 0:785cff1e5a7c 201 {
BartJanssens 0:785cff1e5a7c 202 elt[0] /= s;
BartJanssens 0:785cff1e5a7c 203 elt[1] /= s;
BartJanssens 0:785cff1e5a7c 204 elt[2] /= s;
BartJanssens 0:785cff1e5a7c 205
BartJanssens 0:785cff1e5a7c 206 return(SELF);
BartJanssens 0:785cff1e5a7c 207 }
BartJanssens 0:785cff1e5a7c 208
BartJanssens 0:785cff1e5a7c 209 inline Vec3 Vec3::operator + (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 210 {
BartJanssens 0:785cff1e5a7c 211 Vec3 result;
BartJanssens 0:785cff1e5a7c 212
BartJanssens 0:785cff1e5a7c 213 result[0] = elt[0] + a[0];
BartJanssens 0:785cff1e5a7c 214 result[1] = elt[1] + a[1];
BartJanssens 0:785cff1e5a7c 215 result[2] = elt[2] + a[2];
BartJanssens 0:785cff1e5a7c 216
BartJanssens 0:785cff1e5a7c 217 return(result);
BartJanssens 0:785cff1e5a7c 218 }
BartJanssens 0:785cff1e5a7c 219
BartJanssens 0:785cff1e5a7c 220 inline Vec3 Vec3::operator - (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 221 {
BartJanssens 0:785cff1e5a7c 222 Vec3 result;
BartJanssens 0:785cff1e5a7c 223
BartJanssens 0:785cff1e5a7c 224 result[0] = elt[0] - a[0];
BartJanssens 0:785cff1e5a7c 225 result[1] = elt[1] - a[1];
BartJanssens 0:785cff1e5a7c 226 result[2] = elt[2] - a[2];
BartJanssens 0:785cff1e5a7c 227
BartJanssens 0:785cff1e5a7c 228 return(result);
BartJanssens 0:785cff1e5a7c 229 }
BartJanssens 0:785cff1e5a7c 230
BartJanssens 0:785cff1e5a7c 231 inline Vec3 Vec3::operator - () const
BartJanssens 0:785cff1e5a7c 232 {
BartJanssens 0:785cff1e5a7c 233 Vec3 result;
BartJanssens 0:785cff1e5a7c 234
BartJanssens 0:785cff1e5a7c 235 result[0] = -elt[0];
BartJanssens 0:785cff1e5a7c 236 result[1] = -elt[1];
BartJanssens 0:785cff1e5a7c 237 result[2] = -elt[2];
BartJanssens 0:785cff1e5a7c 238
BartJanssens 0:785cff1e5a7c 239 return(result);
BartJanssens 0:785cff1e5a7c 240 }
BartJanssens 0:785cff1e5a7c 241
BartJanssens 0:785cff1e5a7c 242 inline Vec3 Vec3::operator * (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 243 {
BartJanssens 0:785cff1e5a7c 244 Vec3 result;
BartJanssens 0:785cff1e5a7c 245
BartJanssens 0:785cff1e5a7c 246 result[0] = elt[0] * a[0];
BartJanssens 0:785cff1e5a7c 247 result[1] = elt[1] * a[1];
BartJanssens 0:785cff1e5a7c 248 result[2] = elt[2] * a[2];
BartJanssens 0:785cff1e5a7c 249
BartJanssens 0:785cff1e5a7c 250 return(result);
BartJanssens 0:785cff1e5a7c 251 }
BartJanssens 0:785cff1e5a7c 252
BartJanssens 0:785cff1e5a7c 253 inline Vec3 Vec3::operator * (double s) const
BartJanssens 0:785cff1e5a7c 254 {
BartJanssens 0:785cff1e5a7c 255 Vec3 result;
BartJanssens 0:785cff1e5a7c 256
BartJanssens 0:785cff1e5a7c 257 result[0] = elt[0] * s;
BartJanssens 0:785cff1e5a7c 258 result[1] = elt[1] * s;
BartJanssens 0:785cff1e5a7c 259 result[2] = elt[2] * s;
BartJanssens 0:785cff1e5a7c 260
BartJanssens 0:785cff1e5a7c 261 return(result);
BartJanssens 0:785cff1e5a7c 262 }
BartJanssens 0:785cff1e5a7c 263
BartJanssens 0:785cff1e5a7c 264 inline Vec3 Vec3::operator / (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 265 {
BartJanssens 0:785cff1e5a7c 266 Vec3 result;
BartJanssens 0:785cff1e5a7c 267
BartJanssens 0:785cff1e5a7c 268 result[0] = elt[0] / a[0];
BartJanssens 0:785cff1e5a7c 269 result[1] = elt[1] / a[1];
BartJanssens 0:785cff1e5a7c 270 result[2] = elt[2] / a[2];
BartJanssens 0:785cff1e5a7c 271
BartJanssens 0:785cff1e5a7c 272 return(result);
BartJanssens 0:785cff1e5a7c 273 }
BartJanssens 0:785cff1e5a7c 274
BartJanssens 0:785cff1e5a7c 275 inline Vec3 Vec3::operator / (double s) const
BartJanssens 0:785cff1e5a7c 276 {
BartJanssens 0:785cff1e5a7c 277 Vec3 result;
BartJanssens 0:785cff1e5a7c 278
BartJanssens 0:785cff1e5a7c 279 result[0] = elt[0] / s;
BartJanssens 0:785cff1e5a7c 280 result[1] = elt[1] / s;
BartJanssens 0:785cff1e5a7c 281 result[2] = elt[2] / s;
BartJanssens 0:785cff1e5a7c 282
BartJanssens 0:785cff1e5a7c 283 return(result);
BartJanssens 0:785cff1e5a7c 284 }
BartJanssens 0:785cff1e5a7c 285
BartJanssens 0:785cff1e5a7c 286 inline Vec3 operator * (double s, const Vec3 &v)
BartJanssens 0:785cff1e5a7c 287 {
BartJanssens 0:785cff1e5a7c 288 return(v * s);
BartJanssens 0:785cff1e5a7c 289 }
BartJanssens 0:785cff1e5a7c 290
BartJanssens 0:785cff1e5a7c 291 inline Vec3 &Vec3::MakeUnit(Int n, double k)
BartJanssens 0:785cff1e5a7c 292 {
BartJanssens 0:785cff1e5a7c 293 if (n == 0)
BartJanssens 0:785cff1e5a7c 294 { elt[0] = k; elt[1] = vl_zero; elt[2] = vl_zero; }
BartJanssens 0:785cff1e5a7c 295 else if (n == 1)
BartJanssens 0:785cff1e5a7c 296 { elt[0] = vl_zero; elt[1] = k; elt[2] = vl_zero; }
BartJanssens 0:785cff1e5a7c 297 else if (n == 2)
BartJanssens 0:785cff1e5a7c 298 { elt[0] = vl_zero; elt[1] = vl_zero; elt[2] = k; }
BartJanssens 0:785cff1e5a7c 299 else
BartJanssens 0:785cff1e5a7c 300 _Error("(Vec3::Unit) illegal unit vector");
BartJanssens 0:785cff1e5a7c 301
BartJanssens 0:785cff1e5a7c 302 return(SELF);
BartJanssens 0:785cff1e5a7c 303 }
BartJanssens 0:785cff1e5a7c 304
BartJanssens 0:785cff1e5a7c 305 inline Vec3 &Vec3::MakeZero()
BartJanssens 0:785cff1e5a7c 306 {
BartJanssens 0:785cff1e5a7c 307 elt[0] = vl_zero; elt[1] = vl_zero; elt[2] = vl_zero;
BartJanssens 0:785cff1e5a7c 308
BartJanssens 0:785cff1e5a7c 309 return(SELF);
BartJanssens 0:785cff1e5a7c 310 }
BartJanssens 0:785cff1e5a7c 311
BartJanssens 0:785cff1e5a7c 312 inline Vec3 &Vec3::MakeBlock(double k)
BartJanssens 0:785cff1e5a7c 313 {
BartJanssens 0:785cff1e5a7c 314 elt[0] = k; elt[1] = k; elt[2] = k;
BartJanssens 0:785cff1e5a7c 315
BartJanssens 0:785cff1e5a7c 316 return(SELF);
BartJanssens 0:785cff1e5a7c 317 }
BartJanssens 0:785cff1e5a7c 318
BartJanssens 0:785cff1e5a7c 319 inline Vec3 &Vec3::Normalise()
BartJanssens 0:785cff1e5a7c 320 {
BartJanssens 0:785cff1e5a7c 321 Assert(sqrlen(SELF) > 0.0, "normalising length-zero vector");
BartJanssens 0:785cff1e5a7c 322 SELF /= len(SELF);
BartJanssens 0:785cff1e5a7c 323
BartJanssens 0:785cff1e5a7c 324 return(SELF);
BartJanssens 0:785cff1e5a7c 325 }
BartJanssens 0:785cff1e5a7c 326
BartJanssens 0:785cff1e5a7c 327
BartJanssens 0:785cff1e5a7c 328 inline Vec3::Vec3(ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 329 {
BartJanssens 0:785cff1e5a7c 330 elt[0] = k; elt[1] = k; elt[2] = k;
BartJanssens 0:785cff1e5a7c 331 }
BartJanssens 0:785cff1e5a7c 332
BartJanssens 0:785cff1e5a7c 333 inline Vec3 &Vec3::operator = (ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 334 {
BartJanssens 0:785cff1e5a7c 335 elt[0] = k; elt[1] = k; elt[2] = k;
BartJanssens 0:785cff1e5a7c 336
BartJanssens 0:785cff1e5a7c 337 return(SELF);
BartJanssens 0:785cff1e5a7c 338 }
BartJanssens 0:785cff1e5a7c 339
BartJanssens 0:785cff1e5a7c 340 inline Vec3::Vec3(Axis a)
BartJanssens 0:785cff1e5a7c 341 {
BartJanssens 0:785cff1e5a7c 342 MakeUnit(a, vl_one);
BartJanssens 0:785cff1e5a7c 343 }
BartJanssens 0:785cff1e5a7c 344
BartJanssens 0:785cff1e5a7c 345
BartJanssens 0:785cff1e5a7c 346 inline Bool Vec3::operator == (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 347 {
BartJanssens 0:785cff1e5a7c 348 return(elt[0] == a[0] && elt[1] == a[1] && elt[2] == a[2]);
BartJanssens 0:785cff1e5a7c 349 }
BartJanssens 0:785cff1e5a7c 350
BartJanssens 0:785cff1e5a7c 351 inline Bool Vec3::operator != (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 352 {
BartJanssens 0:785cff1e5a7c 353 return(elt[0] != a[0] || elt[1] != a[1] || elt[2] != a[2]);
BartJanssens 0:785cff1e5a7c 354 }
BartJanssens 0:785cff1e5a7c 355
BartJanssens 0:785cff1e5a7c 356 inline Bool Vec3::operator < (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 357 {
BartJanssens 0:785cff1e5a7c 358 return(elt[0] < a[0] && elt[1] < a[1] && elt[2] < a[2]);
BartJanssens 0:785cff1e5a7c 359 }
BartJanssens 0:785cff1e5a7c 360
BartJanssens 0:785cff1e5a7c 361 inline Bool Vec3::operator >= (const Vec3 &a) const
BartJanssens 0:785cff1e5a7c 362 {
BartJanssens 0:785cff1e5a7c 363 return(elt[0] >= a[0] && elt[1] >= a[1] && elt[2] >= a[2]);
BartJanssens 0:785cff1e5a7c 364 }
BartJanssens 0:785cff1e5a7c 365
BartJanssens 0:785cff1e5a7c 366
BartJanssens 0:785cff1e5a7c 367 inline double dot(const Vec3 &a, const Vec3 &b)
BartJanssens 0:785cff1e5a7c 368 {
BartJanssens 0:785cff1e5a7c 369 return(a[0] * b[0] + a[1] * b[1] + a[2] * b[2]);
BartJanssens 0:785cff1e5a7c 370 }
BartJanssens 0:785cff1e5a7c 371
BartJanssens 0:785cff1e5a7c 372 inline double len(const Vec3 &v)
BartJanssens 0:785cff1e5a7c 373 {
BartJanssens 0:785cff1e5a7c 374 return(sqrt(dot(v, v)));
BartJanssens 0:785cff1e5a7c 375 }
BartJanssens 0:785cff1e5a7c 376
BartJanssens 0:785cff1e5a7c 377 inline double sqrlen(const Vec3 &v)
BartJanssens 0:785cff1e5a7c 378 {
BartJanssens 0:785cff1e5a7c 379 return(dot(v, v));
BartJanssens 0:785cff1e5a7c 380 }
BartJanssens 0:785cff1e5a7c 381
BartJanssens 0:785cff1e5a7c 382 inline Vec3 norm(const Vec3 &v)
BartJanssens 0:785cff1e5a7c 383 {
BartJanssens 0:785cff1e5a7c 384 Assert(sqrlen(v) > 0.0, "normalising length-zero vector");
BartJanssens 0:785cff1e5a7c 385 return(v / len(v));
BartJanssens 0:785cff1e5a7c 386 }
BartJanssens 0:785cff1e5a7c 387
BartJanssens 0:785cff1e5a7c 388 inline Void normalise(Vec3 &v)
BartJanssens 0:785cff1e5a7c 389 {
BartJanssens 0:785cff1e5a7c 390 v /= len(v);
BartJanssens 0:785cff1e5a7c 391 }
BartJanssens 0:785cff1e5a7c 392
BartJanssens 0:785cff1e5a7c 393 inline Vec3 cross(const Vec3 &a, const Vec3 &b)
BartJanssens 0:785cff1e5a7c 394 {
BartJanssens 0:785cff1e5a7c 395 Vec3 result;
BartJanssens 0:785cff1e5a7c 396
BartJanssens 0:785cff1e5a7c 397 result[0] = a[1] * b[2] - a[2] * b[1];
BartJanssens 0:785cff1e5a7c 398 result[1] = a[2] * b[0] - a[0] * b[2];
BartJanssens 0:785cff1e5a7c 399 result[2] = a[0] * b[1] - a[1] * b[0];
BartJanssens 0:785cff1e5a7c 400
BartJanssens 0:785cff1e5a7c 401 return(result);
BartJanssens 0:785cff1e5a7c 402 }
BartJanssens 0:785cff1e5a7c 403
BartJanssens 0:785cff1e5a7c 404 inline Vec2 proj(const Vec3 &v)
BartJanssens 0:785cff1e5a7c 405 {
BartJanssens 0:785cff1e5a7c 406 Vec2 result;
BartJanssens 0:785cff1e5a7c 407
BartJanssens 0:785cff1e5a7c 408 Assert(v[2] != 0, "(Vec3/proj) last elt. is zero");
BartJanssens 0:785cff1e5a7c 409
BartJanssens 0:785cff1e5a7c 410 result[0] = v[0] / v[2];
BartJanssens 0:785cff1e5a7c 411 result[1] = v[1] / v[2];
BartJanssens 0:785cff1e5a7c 412
BartJanssens 0:785cff1e5a7c 413 return(result);
BartJanssens 0:785cff1e5a7c 414 }
BartJanssens 0:785cff1e5a7c 415
BartJanssens 0:785cff1e5a7c 416 inline void printVec3(const Vec3 &v)
BartJanssens 0:785cff1e5a7c 417 {
BartJanssens 0:785cff1e5a7c 418 printf("[%10f %10f %10f]",v[0],v[1],v[2]);
BartJanssens 0:785cff1e5a7c 419 }
BartJanssens 0:785cff1e5a7c 420
BartJanssens 0:785cff1e5a7c 421 #endif