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

Committer:
BartJanssens
Date:
Tue Jan 05 13:37:50 2016 +0000
Revision:
1:e25ff4b06ed2
Parent:
0:785cff1e5a7c
fixed va_list bug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:785cff1e5a7c 1 /*
BartJanssens 0:785cff1e5a7c 2 File: Vec.h
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Defines a generic resizeable 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 __Vec__
BartJanssens 0:785cff1e5a7c 12 #define __Vec__
BartJanssens 0:785cff1e5a7c 13 #include "Basics.h"
BartJanssens 0:785cff1e5a7c 14 #include "Constants.h"
BartJanssens 0:785cff1e5a7c 15 #include "Utils.h"
BartJanssens 0:785cff1e5a7c 16
BartJanssens 0:785cff1e5a7c 17 class Vec2;
BartJanssens 0:785cff1e5a7c 18 class Vec3;
BartJanssens 0:785cff1e5a7c 19 class Vec4;
BartJanssens 0:785cff1e5a7c 20
BartJanssens 0:785cff1e5a7c 21
BartJanssens 0:785cff1e5a7c 22 // --- Vec Class --------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 23
BartJanssens 0:785cff1e5a7c 24 class Vec
BartJanssens 0:785cff1e5a7c 25 {
BartJanssens 0:785cff1e5a7c 26 public:
BartJanssens 0:785cff1e5a7c 27
BartJanssens 0:785cff1e5a7c 28 // Constructors
BartJanssens 0:785cff1e5a7c 29
BartJanssens 0:785cff1e5a7c 30 Vec(); // Null vector
BartJanssens 0:785cff1e5a7c 31 explicit Vec(Int n); // n-element vector
BartJanssens 0:785cff1e5a7c 32 Vec(Int n, double elt0, ...); // e.g. Vec(3, 1.1, 2.0, 3.4)
BartJanssens 0:785cff1e5a7c 33 Vec(Int n, Real *data); // Vector reference
BartJanssens 0:785cff1e5a7c 34 Vec(const Vec &v); // Copy constructor
BartJanssens 0:785cff1e5a7c 35 Vec(const Vec2 &v); // reference to a Vec2
BartJanssens 0:785cff1e5a7c 36 Vec(const Vec3 &v); // reference to a Vec3
BartJanssens 0:785cff1e5a7c 37 Vec(const Vec4 &v); // reference to a Vec4
BartJanssens 0:785cff1e5a7c 38 Vec(Int n, ZeroOrOne); // Zero or all-ones vector
BartJanssens 0:785cff1e5a7c 39 Vec(Int n, Axis a); // Unit vector
BartJanssens 0:785cff1e5a7c 40 ~Vec(); // Destructor
BartJanssens 0:785cff1e5a7c 41
BartJanssens 0:785cff1e5a7c 42 // Accessor functions
BartJanssens 0:785cff1e5a7c 43
BartJanssens 0:785cff1e5a7c 44 Int Elts() const;
BartJanssens 0:785cff1e5a7c 45
BartJanssens 0:785cff1e5a7c 46 Real &operator [] (Int i);
BartJanssens 0:785cff1e5a7c 47 Real operator [] (Int i) const;
BartJanssens 0:785cff1e5a7c 48
BartJanssens 0:785cff1e5a7c 49 Void SetSize(Int n); // Resize the vector
BartJanssens 0:785cff1e5a7c 50 Real *Ref() const; // Return pointer to data
BartJanssens 0:785cff1e5a7c 51
BartJanssens 0:785cff1e5a7c 52 // Assignment operators
BartJanssens 0:785cff1e5a7c 53
BartJanssens 0:785cff1e5a7c 54 Vec &operator = (const Vec &v); // v = a etc.
BartJanssens 0:785cff1e5a7c 55 Vec &operator = (ZeroOrOne k);
BartJanssens 0:785cff1e5a7c 56 Vec &operator = (Axis a);
BartJanssens 0:785cff1e5a7c 57 Vec &operator = (const Vec2 &v);
BartJanssens 0:785cff1e5a7c 58 Vec &operator = (const Vec3 &v);
BartJanssens 0:785cff1e5a7c 59 Vec &operator = (const Vec4 &v);
BartJanssens 0:785cff1e5a7c 60
BartJanssens 0:785cff1e5a7c 61 // In-Place operators
BartJanssens 0:785cff1e5a7c 62
BartJanssens 0:785cff1e5a7c 63 Vec &operator += (const Vec &v);
BartJanssens 0:785cff1e5a7c 64 Vec &operator -= (const Vec &v);
BartJanssens 0:785cff1e5a7c 65 Vec &operator *= (const Vec &v);
BartJanssens 0:785cff1e5a7c 66 Vec &operator *= (Real s);
BartJanssens 0:785cff1e5a7c 67 Vec &operator /= (const Vec &v);
BartJanssens 0:785cff1e5a7c 68 Vec &operator /= (Real s);
BartJanssens 0:785cff1e5a7c 69
BartJanssens 0:785cff1e5a7c 70 // Vector initialisers
BartJanssens 0:785cff1e5a7c 71
BartJanssens 0:785cff1e5a7c 72 Vec &MakeZero();
BartJanssens 0:785cff1e5a7c 73 Vec &MakeUnit(Int i, Real k = vl_one);
BartJanssens 0:785cff1e5a7c 74 Vec &MakeBlock(Real k = vl_one);
BartJanssens 0:785cff1e5a7c 75
BartJanssens 0:785cff1e5a7c 76 Vec &Normalise(); // Normalise vector
BartJanssens 0:785cff1e5a7c 77 Vec &Clamp(Real fuzz);
BartJanssens 0:785cff1e5a7c 78 Vec &Clamp();
BartJanssens 0:785cff1e5a7c 79
BartJanssens 0:785cff1e5a7c 80 Bool IsRef() const { return((elts & VL_REF_FLAG) != 0); };
BartJanssens 0:785cff1e5a7c 81
BartJanssens 0:785cff1e5a7c 82 // Private...
BartJanssens 0:785cff1e5a7c 83
BartJanssens 0:785cff1e5a7c 84 protected:
BartJanssens 0:785cff1e5a7c 85
BartJanssens 0:785cff1e5a7c 86 Real *data;
BartJanssens 0:785cff1e5a7c 87 UInt elts;
BartJanssens 0:785cff1e5a7c 88 };
BartJanssens 0:785cff1e5a7c 89
BartJanssens 0:785cff1e5a7c 90
BartJanssens 0:785cff1e5a7c 91 // --- Vec Comparison Operators -----------------------------------------------
BartJanssens 0:785cff1e5a7c 92
BartJanssens 0:785cff1e5a7c 93 Bool operator == (const Vec &a, const Vec &b);
BartJanssens 0:785cff1e5a7c 94 Bool operator != (const Vec &a, const Vec &b);
BartJanssens 0:785cff1e5a7c 95
BartJanssens 0:785cff1e5a7c 96
BartJanssens 0:785cff1e5a7c 97 // --- Vec Arithmetic Operators -----------------------------------------------
BartJanssens 0:785cff1e5a7c 98
BartJanssens 0:785cff1e5a7c 99 Vec operator + (const Vec &a, const Vec &b);
BartJanssens 0:785cff1e5a7c 100 Vec operator - (const Vec &a, const Vec &b);
BartJanssens 0:785cff1e5a7c 101 Vec operator - (const Vec &v);
BartJanssens 0:785cff1e5a7c 102 Vec operator * (const Vec &a, const Vec &b);
BartJanssens 0:785cff1e5a7c 103 Vec operator * (const Vec &v, Real s);
BartJanssens 0:785cff1e5a7c 104 Vec operator / (const Vec &a, const Vec &b);
BartJanssens 0:785cff1e5a7c 105 Vec operator / (const Vec &v, Real s);
BartJanssens 0:785cff1e5a7c 106 Vec operator * (Real s, const Vec &v);
BartJanssens 0:785cff1e5a7c 107
BartJanssens 0:785cff1e5a7c 108 Real dot(const Vec &a, const Vec &b);// v . a
BartJanssens 0:785cff1e5a7c 109 inline Real len(const Vec &v); // || v ||
BartJanssens 0:785cff1e5a7c 110 inline Real sqrlen(const Vec &v); // v . v
BartJanssens 0:785cff1e5a7c 111 inline Vec norm(const Vec &v); // v / || v ||
BartJanssens 0:785cff1e5a7c 112 inline Void normalise(Vec &v); // v = norm(v)
BartJanssens 0:785cff1e5a7c 113
BartJanssens 0:785cff1e5a7c 114 Vec clamped(const Vec &v, Real fuzz);
BartJanssens 0:785cff1e5a7c 115 Vec clamped(const Vec &v);
BartJanssens 0:785cff1e5a7c 116
BartJanssens 0:785cff1e5a7c 117
BartJanssens 0:785cff1e5a7c 118 // --- Vec Input & Output -----------------------------------------------------
BartJanssens 0:785cff1e5a7c 119
BartJanssens 0:785cff1e5a7c 120 //std::ostream &operator << (std::ostream &s, const Vec &v);
BartJanssens 0:785cff1e5a7c 121 //std::istream &operator >> (std::istream &s, Vec &v);
BartJanssens 0:785cff1e5a7c 122
BartJanssens 0:785cff1e5a7c 123 inline void printVec(const Vec &v);
BartJanssens 0:785cff1e5a7c 124
BartJanssens 0:785cff1e5a7c 125 // --- Sub-vector functions ---------------------------------------------------
BartJanssens 0:785cff1e5a7c 126
BartJanssens 0:785cff1e5a7c 127 inline Vec sub(const Vec &v, Int start, Int length);
BartJanssens 0:785cff1e5a7c 128 inline Vec first(const Vec &v, Int length);
BartJanssens 0:785cff1e5a7c 129 inline Vec last(const Vec &v, Int length);
BartJanssens 0:785cff1e5a7c 130
BartJanssens 0:785cff1e5a7c 131
BartJanssens 0:785cff1e5a7c 132 // --- Vec inlines ------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 133
BartJanssens 0:785cff1e5a7c 134 inline Vec::Vec() : data(0), elts(0)
BartJanssens 0:785cff1e5a7c 135 {
BartJanssens 0:785cff1e5a7c 136 }
BartJanssens 0:785cff1e5a7c 137
BartJanssens 0:785cff1e5a7c 138 inline Vec::Vec(Int n) : elts(n)
BartJanssens 0:785cff1e5a7c 139 {
BartJanssens 0:785cff1e5a7c 140 Assert(n > 0,"(Vec) illegal vector size");
BartJanssens 0:785cff1e5a7c 141
BartJanssens 0:785cff1e5a7c 142 data = new Real[n];
BartJanssens 0:785cff1e5a7c 143 }
BartJanssens 0:785cff1e5a7c 144
BartJanssens 0:785cff1e5a7c 145 inline Vec::Vec(Int n, Real *data) : data(data), elts(n | VL_REF_FLAG)
BartJanssens 0:785cff1e5a7c 146 {
BartJanssens 0:785cff1e5a7c 147 }
BartJanssens 0:785cff1e5a7c 148
BartJanssens 0:785cff1e5a7c 149 inline Int Vec::Elts() const
BartJanssens 0:785cff1e5a7c 150 {
BartJanssens 0:785cff1e5a7c 151 return(elts & VL_REF_MASK);
BartJanssens 0:785cff1e5a7c 152 }
BartJanssens 0:785cff1e5a7c 153
BartJanssens 0:785cff1e5a7c 154 inline Real &Vec::operator [] (Int i)
BartJanssens 0:785cff1e5a7c 155 {
BartJanssens 0:785cff1e5a7c 156 CheckRange(i, 0, Elts(), "Vec::[i]");
BartJanssens 0:785cff1e5a7c 157
BartJanssens 0:785cff1e5a7c 158 return(data[i]);
BartJanssens 0:785cff1e5a7c 159 }
BartJanssens 0:785cff1e5a7c 160
BartJanssens 0:785cff1e5a7c 161 inline Real Vec::operator [] (Int i) const
BartJanssens 0:785cff1e5a7c 162 {
BartJanssens 0:785cff1e5a7c 163 CheckRange(i, 0, Elts(), "Vec::[i]");
BartJanssens 0:785cff1e5a7c 164
BartJanssens 0:785cff1e5a7c 165 return(data[i]);
BartJanssens 0:785cff1e5a7c 166 }
BartJanssens 0:785cff1e5a7c 167
BartJanssens 0:785cff1e5a7c 168 inline Real *Vec::Ref() const
BartJanssens 0:785cff1e5a7c 169 {
BartJanssens 0:785cff1e5a7c 170 return(data);
BartJanssens 0:785cff1e5a7c 171 }
BartJanssens 0:785cff1e5a7c 172
BartJanssens 0:785cff1e5a7c 173 inline Vec &Vec::operator = (ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 174 {
BartJanssens 0:785cff1e5a7c 175 MakeBlock(k);
BartJanssens 0:785cff1e5a7c 176
BartJanssens 0:785cff1e5a7c 177 return(SELF);
BartJanssens 0:785cff1e5a7c 178 }
BartJanssens 0:785cff1e5a7c 179
BartJanssens 0:785cff1e5a7c 180 inline Vec &Vec::operator = (Axis a)
BartJanssens 0:785cff1e5a7c 181 {
BartJanssens 0:785cff1e5a7c 182 MakeUnit(a);
BartJanssens 0:785cff1e5a7c 183
BartJanssens 0:785cff1e5a7c 184 return(SELF);
BartJanssens 0:785cff1e5a7c 185 }
BartJanssens 0:785cff1e5a7c 186
BartJanssens 0:785cff1e5a7c 187 inline Real len(const Vec &v)
BartJanssens 0:785cff1e5a7c 188 {
BartJanssens 0:785cff1e5a7c 189 return(sqrt(dot(v, v)));
BartJanssens 0:785cff1e5a7c 190 }
BartJanssens 0:785cff1e5a7c 191
BartJanssens 0:785cff1e5a7c 192 inline Real sqrlen(const Vec &v)
BartJanssens 0:785cff1e5a7c 193 {
BartJanssens 0:785cff1e5a7c 194 return(dot(v, v));
BartJanssens 0:785cff1e5a7c 195 }
BartJanssens 0:785cff1e5a7c 196
BartJanssens 0:785cff1e5a7c 197 inline Vec norm(const Vec &v)
BartJanssens 0:785cff1e5a7c 198 {
BartJanssens 0:785cff1e5a7c 199 Assert(sqrlen(v) > 0.0, "normalising length-zero vector");
BartJanssens 0:785cff1e5a7c 200 return(v / len(v));
BartJanssens 0:785cff1e5a7c 201 }
BartJanssens 0:785cff1e5a7c 202
BartJanssens 0:785cff1e5a7c 203 inline Void normalise(Vec &v)
BartJanssens 0:785cff1e5a7c 204 {
BartJanssens 0:785cff1e5a7c 205 v /= len(v);
BartJanssens 0:785cff1e5a7c 206 }
BartJanssens 0:785cff1e5a7c 207
BartJanssens 0:785cff1e5a7c 208 inline Vec sub(const Vec &v, Int start, Int length)
BartJanssens 0:785cff1e5a7c 209 {
BartJanssens 0:785cff1e5a7c 210 Assert(start >= 0 && length > 0 && start + length <= v.Elts(),
BartJanssens 0:785cff1e5a7c 211 "(sub(Vec)) illegal subset of vector");
BartJanssens 0:785cff1e5a7c 212
BartJanssens 0:785cff1e5a7c 213 return(Vec(length, v.Ref() + start));
BartJanssens 0:785cff1e5a7c 214 }
BartJanssens 0:785cff1e5a7c 215
BartJanssens 0:785cff1e5a7c 216 inline Vec first(const Vec &v, Int length)
BartJanssens 0:785cff1e5a7c 217 {
BartJanssens 0:785cff1e5a7c 218 Assert(length > 0 && length <= v.Elts(),
BartJanssens 0:785cff1e5a7c 219 "(first(Vec)) illegal subset of vector");
BartJanssens 0:785cff1e5a7c 220
BartJanssens 0:785cff1e5a7c 221 return(Vec(length, v.Ref()));
BartJanssens 0:785cff1e5a7c 222 }
BartJanssens 0:785cff1e5a7c 223
BartJanssens 0:785cff1e5a7c 224 inline Vec last(const Vec &v, Int length)
BartJanssens 0:785cff1e5a7c 225 {
BartJanssens 0:785cff1e5a7c 226 Assert(length > 0 && length <= v.Elts(),
BartJanssens 0:785cff1e5a7c 227 "(last(Vec)) illegal subset of vector");
BartJanssens 0:785cff1e5a7c 228
BartJanssens 0:785cff1e5a7c 229 return(Vec(length, v.Ref() + v.Elts() - length));
BartJanssens 0:785cff1e5a7c 230 }
BartJanssens 0:785cff1e5a7c 231
BartJanssens 0:785cff1e5a7c 232 inline Vec &Vec::Normalise()
BartJanssens 0:785cff1e5a7c 233 {
BartJanssens 0:785cff1e5a7c 234 Assert(sqrlen(SELF) > 0.0, "normalising length-zero vector");
BartJanssens 0:785cff1e5a7c 235 SELF /= len(SELF);
BartJanssens 0:785cff1e5a7c 236 return(SELF);
BartJanssens 0:785cff1e5a7c 237 }
BartJanssens 0:785cff1e5a7c 238
BartJanssens 0:785cff1e5a7c 239 inline void printVec(const Vec &v)
BartJanssens 0:785cff1e5a7c 240 {
BartJanssens 0:785cff1e5a7c 241 Int i;
BartJanssens 0:785cff1e5a7c 242 printf("[");
BartJanssens 0:785cff1e5a7c 243 if (v.Elts() > 0)
BartJanssens 0:785cff1e5a7c 244 {
BartJanssens 0:785cff1e5a7c 245 printf("%10f",v[0]);
BartJanssens 0:785cff1e5a7c 246
BartJanssens 0:785cff1e5a7c 247 for (i = 1; i < v.Elts(); i++)
BartJanssens 0:785cff1e5a7c 248 printf(" %10f", v[i]);
BartJanssens 0:785cff1e5a7c 249 }
BartJanssens 0:785cff1e5a7c 250 printf("]");
BartJanssens 0:785cff1e5a7c 251 }
BartJanssens 0:785cff1e5a7c 252
BartJanssens 0:785cff1e5a7c 253
BartJanssens 0:785cff1e5a7c 254 #endif
BartJanssens 0:785cff1e5a7c 255