Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html
Vec.h@1:e25ff4b06ed2, 2016-01-05 (annotated)
- 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?
User | Revision | Line number | New 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 |