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.cpp
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Implements Vec.h
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
BartJanssens 0:785cff1e5a7c 12
BartJanssens 0:785cff1e5a7c 13 #include "Vec.h"
BartJanssens 0:785cff1e5a7c 14
BartJanssens 0:785cff1e5a7c 15 //#include <cctype>
BartJanssens 0:785cff1e5a7c 16 //#include <cstring>
BartJanssens 1:e25ff4b06ed2 17 #include <cstdarg>
BartJanssens 0:785cff1e5a7c 18 //#include <iomanip>
BartJanssens 0:785cff1e5a7c 19 #include "Vec2.h"
BartJanssens 0:785cff1e5a7c 20 #include "Vec3.h"
BartJanssens 0:785cff1e5a7c 21 #include "Vec4.h"
BartJanssens 0:785cff1e5a7c 22
BartJanssens 0:785cff1e5a7c 23 // --- Vec Constructors -------------------------------------------------------
BartJanssens 0:785cff1e5a7c 24
BartJanssens 0:785cff1e5a7c 25
BartJanssens 0:785cff1e5a7c 26 Vec::Vec(Int n, ZeroOrOne k) : elts(n)
BartJanssens 0:785cff1e5a7c 27 {
BartJanssens 0:785cff1e5a7c 28 Assert(n > 0,"(Vec) illegal vector size");
BartJanssens 0:785cff1e5a7c 29
BartJanssens 0:785cff1e5a7c 30 data = new Real[n];
BartJanssens 0:785cff1e5a7c 31
BartJanssens 0:785cff1e5a7c 32 MakeBlock(k);
BartJanssens 0:785cff1e5a7c 33 }
BartJanssens 0:785cff1e5a7c 34
BartJanssens 0:785cff1e5a7c 35 Vec::Vec(Int n, Axis a) : elts(n)
BartJanssens 0:785cff1e5a7c 36 {
BartJanssens 0:785cff1e5a7c 37 Assert(n > 0,"(Vec) illegal vector size");
BartJanssens 0:785cff1e5a7c 38
BartJanssens 0:785cff1e5a7c 39 data = new Real[n];
BartJanssens 0:785cff1e5a7c 40
BartJanssens 0:785cff1e5a7c 41 MakeUnit(a);
BartJanssens 0:785cff1e5a7c 42 }
BartJanssens 0:785cff1e5a7c 43
BartJanssens 0:785cff1e5a7c 44 Vec::Vec(const Vec &v)
BartJanssens 0:785cff1e5a7c 45 {
BartJanssens 0:785cff1e5a7c 46 Assert(v.data != 0, "(Vec) Can't construct from a null vector");
BartJanssens 0:785cff1e5a7c 47
BartJanssens 0:785cff1e5a7c 48 elts = v.Elts();
BartJanssens 0:785cff1e5a7c 49 data = new Real[elts];
BartJanssens 0:785cff1e5a7c 50
BartJanssens 0:785cff1e5a7c 51 #ifdef VL_USE_MEMCPY
BartJanssens 0:785cff1e5a7c 52 memcpy(data, v.Ref(), sizeof(Real) * Elts());
BartJanssens 0:785cff1e5a7c 53 #else
BartJanssens 0:785cff1e5a7c 54 for (Int i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 55 data[i] = v[i];
BartJanssens 0:785cff1e5a7c 56 #endif
BartJanssens 0:785cff1e5a7c 57 }
BartJanssens 0:785cff1e5a7c 58
BartJanssens 0:785cff1e5a7c 59 Vec::Vec(const Vec2 &v) : data(v.Ref()), elts(v.Elts() | VL_REF_FLAG)
BartJanssens 0:785cff1e5a7c 60 {
BartJanssens 0:785cff1e5a7c 61 }
BartJanssens 0:785cff1e5a7c 62
BartJanssens 0:785cff1e5a7c 63 Vec::Vec(const Vec3 &v) : data(v.Ref()), elts(v.Elts() | VL_REF_FLAG)
BartJanssens 0:785cff1e5a7c 64 {
BartJanssens 0:785cff1e5a7c 65 }
BartJanssens 0:785cff1e5a7c 66
BartJanssens 0:785cff1e5a7c 67 Vec::Vec(const Vec4 &v) : data(v.Ref()), elts(v.Elts() | VL_REF_FLAG)
BartJanssens 0:785cff1e5a7c 68 {
BartJanssens 0:785cff1e5a7c 69 }
BartJanssens 0:785cff1e5a7c 70
BartJanssens 0:785cff1e5a7c 71 Vec::Vec(Int n, double elt0, ...) : elts(n)
BartJanssens 0:785cff1e5a7c 72 {
BartJanssens 0:785cff1e5a7c 73 Assert(n > 0,"(Vec) illegal vector size");
BartJanssens 0:785cff1e5a7c 74
BartJanssens 0:785cff1e5a7c 75 va_list ap;
BartJanssens 0:785cff1e5a7c 76 Int i = 1;
BartJanssens 0:785cff1e5a7c 77
BartJanssens 0:785cff1e5a7c 78 data = new Real[n];
BartJanssens 0:785cff1e5a7c 79 va_start(ap, elt0);
BartJanssens 0:785cff1e5a7c 80
BartJanssens 0:785cff1e5a7c 81 SetReal(data[0], elt0);
BartJanssens 0:785cff1e5a7c 82
BartJanssens 0:785cff1e5a7c 83 while (--n)
BartJanssens 0:785cff1e5a7c 84 SetReal(data[i++], va_arg(ap, double));
BartJanssens 0:785cff1e5a7c 85
BartJanssens 0:785cff1e5a7c 86 va_end(ap);
BartJanssens 0:785cff1e5a7c 87 }
BartJanssens 0:785cff1e5a7c 88
BartJanssens 0:785cff1e5a7c 89 Vec::~Vec()
BartJanssens 0:785cff1e5a7c 90 {
BartJanssens 0:785cff1e5a7c 91 Assert(elts != 0,"(Vec) illegal vector size");
BartJanssens 0:785cff1e5a7c 92
BartJanssens 0:785cff1e5a7c 93 if (!IsRef())
BartJanssens 0:785cff1e5a7c 94 delete[] data;
BartJanssens 0:785cff1e5a7c 95 }
BartJanssens 0:785cff1e5a7c 96
BartJanssens 0:785cff1e5a7c 97
BartJanssens 0:785cff1e5a7c 98 // --- Vec Assignment Operators -----------------------------------------------
BartJanssens 0:785cff1e5a7c 99
BartJanssens 0:785cff1e5a7c 100
BartJanssens 0:785cff1e5a7c 101 Vec &Vec::operator = (const Vec &v)
BartJanssens 0:785cff1e5a7c 102 {
BartJanssens 0:785cff1e5a7c 103 if (!IsRef())
BartJanssens 0:785cff1e5a7c 104 SetSize(v.Elts());
BartJanssens 0:785cff1e5a7c 105 else
BartJanssens 0:785cff1e5a7c 106 Assert(Elts() == v.Elts(), "(Vec::=) Vector sizes don't match");
BartJanssens 0:785cff1e5a7c 107
BartJanssens 0:785cff1e5a7c 108 #ifdef VL_USE_MEMCPY
BartJanssens 0:785cff1e5a7c 109 memcpy(data, v.data, sizeof(Real) * Elts());
BartJanssens 0:785cff1e5a7c 110 #else
BartJanssens 0:785cff1e5a7c 111 for (Int i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 112 data[i] = v[i];
BartJanssens 0:785cff1e5a7c 113 #endif
BartJanssens 0:785cff1e5a7c 114
BartJanssens 0:785cff1e5a7c 115 return(SELF);
BartJanssens 0:785cff1e5a7c 116 }
BartJanssens 0:785cff1e5a7c 117
BartJanssens 0:785cff1e5a7c 118 Vec &Vec::operator = (const Vec2 &v)
BartJanssens 0:785cff1e5a7c 119 {
BartJanssens 0:785cff1e5a7c 120 if (!IsRef())
BartJanssens 0:785cff1e5a7c 121 SetSize(v.Elts());
BartJanssens 0:785cff1e5a7c 122 else
BartJanssens 0:785cff1e5a7c 123 Assert(Elts() == v.Elts(), "(Vec::=) Vector sizes don't match");
BartJanssens 0:785cff1e5a7c 124
BartJanssens 0:785cff1e5a7c 125 data[0] = v[0];
BartJanssens 0:785cff1e5a7c 126 data[1] = v[1];
BartJanssens 0:785cff1e5a7c 127
BartJanssens 0:785cff1e5a7c 128 return(SELF);
BartJanssens 0:785cff1e5a7c 129 }
BartJanssens 0:785cff1e5a7c 130
BartJanssens 0:785cff1e5a7c 131 Vec &Vec::operator = (const Vec3 &v)
BartJanssens 0:785cff1e5a7c 132 {
BartJanssens 0:785cff1e5a7c 133 if (!IsRef())
BartJanssens 0:785cff1e5a7c 134 SetSize(v.Elts());
BartJanssens 0:785cff1e5a7c 135 else
BartJanssens 0:785cff1e5a7c 136 Assert(Elts() == v.Elts(), "(Vec::=) Vector sizes don't match");
BartJanssens 0:785cff1e5a7c 137
BartJanssens 0:785cff1e5a7c 138 data[0] = v[0];
BartJanssens 0:785cff1e5a7c 139 data[1] = v[1];
BartJanssens 0:785cff1e5a7c 140 data[2] = v[2];
BartJanssens 0:785cff1e5a7c 141
BartJanssens 0:785cff1e5a7c 142 return(SELF);
BartJanssens 0:785cff1e5a7c 143 }
BartJanssens 0:785cff1e5a7c 144
BartJanssens 0:785cff1e5a7c 145 Vec &Vec::operator = (const Vec4 &v)
BartJanssens 0:785cff1e5a7c 146 {
BartJanssens 0:785cff1e5a7c 147 if (!IsRef())
BartJanssens 0:785cff1e5a7c 148 SetSize(v.Elts());
BartJanssens 0:785cff1e5a7c 149 else
BartJanssens 0:785cff1e5a7c 150 Assert(Elts() == v.Elts(), "(Vec::=) Vector sizes don't match");
BartJanssens 0:785cff1e5a7c 151
BartJanssens 0:785cff1e5a7c 152 data[0] = v[0];
BartJanssens 0:785cff1e5a7c 153 data[1] = v[1];
BartJanssens 0:785cff1e5a7c 154 data[2] = v[2];
BartJanssens 0:785cff1e5a7c 155 data[3] = v[3];
BartJanssens 0:785cff1e5a7c 156
BartJanssens 0:785cff1e5a7c 157 return(SELF);
BartJanssens 0:785cff1e5a7c 158 }
BartJanssens 0:785cff1e5a7c 159
BartJanssens 0:785cff1e5a7c 160 Void Vec::SetSize(Int ni)
BartJanssens 0:785cff1e5a7c 161 {
BartJanssens 0:785cff1e5a7c 162 Assert(ni > 0, "(Vec::SetSize) Illegal vector size");
BartJanssens 0:785cff1e5a7c 163 UInt n = UInt(ni);
BartJanssens 0:785cff1e5a7c 164
BartJanssens 0:785cff1e5a7c 165 if (!IsRef())
BartJanssens 0:785cff1e5a7c 166 {
BartJanssens 0:785cff1e5a7c 167 // Don't reallocate if we already have enough storage
BartJanssens 0:785cff1e5a7c 168
BartJanssens 0:785cff1e5a7c 169 if (n <= elts)
BartJanssens 0:785cff1e5a7c 170 {
BartJanssens 0:785cff1e5a7c 171 elts = n;
BartJanssens 0:785cff1e5a7c 172 return;
BartJanssens 0:785cff1e5a7c 173 }
BartJanssens 0:785cff1e5a7c 174
BartJanssens 0:785cff1e5a7c 175 // Otherwise, delete old storage
BartJanssens 0:785cff1e5a7c 176
BartJanssens 0:785cff1e5a7c 177 delete[] data;
BartJanssens 0:785cff1e5a7c 178
BartJanssens 0:785cff1e5a7c 179 elts = n;
BartJanssens 0:785cff1e5a7c 180 data = new Real[elts];
BartJanssens 0:785cff1e5a7c 181 }
BartJanssens 0:785cff1e5a7c 182 else
BartJanssens 0:785cff1e5a7c 183 Assert(false, "(Vec::SetSize) Can't resize a vector reference");
BartJanssens 0:785cff1e5a7c 184 }
BartJanssens 0:785cff1e5a7c 185
BartJanssens 0:785cff1e5a7c 186 Vec &Vec::MakeZero()
BartJanssens 0:785cff1e5a7c 187 {
BartJanssens 0:785cff1e5a7c 188 #ifdef VL_USE_MEMCPY
BartJanssens 0:785cff1e5a7c 189 memset(data, 0, sizeof(Real) * Elts());
BartJanssens 0:785cff1e5a7c 190 #else
BartJanssens 0:785cff1e5a7c 191 Int j;
BartJanssens 0:785cff1e5a7c 192
BartJanssens 0:785cff1e5a7c 193 for (j = 0; j < Elts(); j++)
BartJanssens 0:785cff1e5a7c 194 data[j] = vl_zero;
BartJanssens 0:785cff1e5a7c 195 #endif
BartJanssens 0:785cff1e5a7c 196
BartJanssens 0:785cff1e5a7c 197 return(SELF);
BartJanssens 0:785cff1e5a7c 198 }
BartJanssens 0:785cff1e5a7c 199
BartJanssens 0:785cff1e5a7c 200 Vec &Vec::MakeUnit(Int i, Real k)
BartJanssens 0:785cff1e5a7c 201 {
BartJanssens 0:785cff1e5a7c 202 MakeZero();
BartJanssens 0:785cff1e5a7c 203 data[i] = k;
BartJanssens 0:785cff1e5a7c 204
BartJanssens 0:785cff1e5a7c 205 return(SELF);
BartJanssens 0:785cff1e5a7c 206 }
BartJanssens 0:785cff1e5a7c 207
BartJanssens 0:785cff1e5a7c 208 Vec &Vec::MakeBlock(Real k)
BartJanssens 0:785cff1e5a7c 209 {
BartJanssens 0:785cff1e5a7c 210 Int i;
BartJanssens 0:785cff1e5a7c 211
BartJanssens 0:785cff1e5a7c 212 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 213 data[i] = k;
BartJanssens 0:785cff1e5a7c 214
BartJanssens 0:785cff1e5a7c 215 return(SELF);
BartJanssens 0:785cff1e5a7c 216 }
BartJanssens 0:785cff1e5a7c 217
BartJanssens 0:785cff1e5a7c 218
BartJanssens 0:785cff1e5a7c 219 // --- Vec In-Place operators -------------------------------------------------
BartJanssens 0:785cff1e5a7c 220
BartJanssens 0:785cff1e5a7c 221
BartJanssens 0:785cff1e5a7c 222 Vec &Vec::operator += (const Vec &b)
BartJanssens 0:785cff1e5a7c 223 {
BartJanssens 0:785cff1e5a7c 224 Assert(Elts() == b.Elts(), "(Vec::+=) vector sizes don't match");
BartJanssens 0:785cff1e5a7c 225
BartJanssens 0:785cff1e5a7c 226 Int i;
BartJanssens 0:785cff1e5a7c 227
BartJanssens 0:785cff1e5a7c 228 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 229 data[i] += b[i];
BartJanssens 0:785cff1e5a7c 230
BartJanssens 0:785cff1e5a7c 231 return(SELF);
BartJanssens 0:785cff1e5a7c 232 }
BartJanssens 0:785cff1e5a7c 233
BartJanssens 0:785cff1e5a7c 234 Vec &Vec::operator -= (const Vec &b)
BartJanssens 0:785cff1e5a7c 235 {
BartJanssens 0:785cff1e5a7c 236 Assert(Elts() == b.Elts(), "(Vec::-=) vector sizes don't match");
BartJanssens 0:785cff1e5a7c 237
BartJanssens 0:785cff1e5a7c 238 Int i;
BartJanssens 0:785cff1e5a7c 239
BartJanssens 0:785cff1e5a7c 240 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 241 data[i] -= b[i];
BartJanssens 0:785cff1e5a7c 242
BartJanssens 0:785cff1e5a7c 243 return(SELF);
BartJanssens 0:785cff1e5a7c 244 }
BartJanssens 0:785cff1e5a7c 245
BartJanssens 0:785cff1e5a7c 246 Vec &Vec::operator *= (const Vec &b)
BartJanssens 0:785cff1e5a7c 247 {
BartJanssens 0:785cff1e5a7c 248 Assert(Elts() == b.Elts(), "(Vec::*=) Vec sizes don't match");
BartJanssens 0:785cff1e5a7c 249
BartJanssens 0:785cff1e5a7c 250 Int i;
BartJanssens 0:785cff1e5a7c 251
BartJanssens 0:785cff1e5a7c 252 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 253 data[i] *= b[i];
BartJanssens 0:785cff1e5a7c 254
BartJanssens 0:785cff1e5a7c 255 return(SELF);
BartJanssens 0:785cff1e5a7c 256 }
BartJanssens 0:785cff1e5a7c 257
BartJanssens 0:785cff1e5a7c 258 Vec &Vec::operator *= (Real s)
BartJanssens 0:785cff1e5a7c 259 {
BartJanssens 0:785cff1e5a7c 260 Int i;
BartJanssens 0:785cff1e5a7c 261
BartJanssens 0:785cff1e5a7c 262 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 263 data[i] *= s;
BartJanssens 0:785cff1e5a7c 264
BartJanssens 0:785cff1e5a7c 265 return(SELF);
BartJanssens 0:785cff1e5a7c 266 }
BartJanssens 0:785cff1e5a7c 267
BartJanssens 0:785cff1e5a7c 268 Vec &Vec::operator /= (const Vec &b)
BartJanssens 0:785cff1e5a7c 269 {
BartJanssens 0:785cff1e5a7c 270 Assert(Elts() == b.Elts(), "(Vec::/=) Vec sizes don't match");
BartJanssens 0:785cff1e5a7c 271
BartJanssens 0:785cff1e5a7c 272 Int i;
BartJanssens 0:785cff1e5a7c 273
BartJanssens 0:785cff1e5a7c 274 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 275 data[i] /= b[i];
BartJanssens 0:785cff1e5a7c 276
BartJanssens 0:785cff1e5a7c 277 return(SELF);
BartJanssens 0:785cff1e5a7c 278 }
BartJanssens 0:785cff1e5a7c 279
BartJanssens 0:785cff1e5a7c 280 Vec &Vec::operator /= (Real s)
BartJanssens 0:785cff1e5a7c 281 {
BartJanssens 0:785cff1e5a7c 282 Int i;
BartJanssens 0:785cff1e5a7c 283
BartJanssens 0:785cff1e5a7c 284 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 285 data[i] /= s;
BartJanssens 0:785cff1e5a7c 286
BartJanssens 0:785cff1e5a7c 287 return(SELF);
BartJanssens 0:785cff1e5a7c 288 }
BartJanssens 0:785cff1e5a7c 289
BartJanssens 0:785cff1e5a7c 290
BartJanssens 0:785cff1e5a7c 291 // --- Vec Comparison Operators -----------------------------------------------
BartJanssens 0:785cff1e5a7c 292
BartJanssens 0:785cff1e5a7c 293
BartJanssens 0:785cff1e5a7c 294 Bool operator == (const Vec &a, const Vec &b)
BartJanssens 0:785cff1e5a7c 295 {
BartJanssens 0:785cff1e5a7c 296 Int i;
BartJanssens 0:785cff1e5a7c 297
BartJanssens 0:785cff1e5a7c 298 for (i = 0; i < a.Elts(); i++)
BartJanssens 0:785cff1e5a7c 299 if (a[i] != b[i])
BartJanssens 0:785cff1e5a7c 300 return(0);
BartJanssens 0:785cff1e5a7c 301
BartJanssens 0:785cff1e5a7c 302 return(1);
BartJanssens 0:785cff1e5a7c 303 }
BartJanssens 0:785cff1e5a7c 304
BartJanssens 0:785cff1e5a7c 305 Bool operator != (const Vec &a, const Vec &b)
BartJanssens 0:785cff1e5a7c 306 {
BartJanssens 0:785cff1e5a7c 307 Int i;
BartJanssens 0:785cff1e5a7c 308
BartJanssens 0:785cff1e5a7c 309 for (i = 0; i < a.Elts(); i++)
BartJanssens 0:785cff1e5a7c 310 if (a[i] != b[i])
BartJanssens 0:785cff1e5a7c 311 return(1);
BartJanssens 0:785cff1e5a7c 312
BartJanssens 0:785cff1e5a7c 313 return(0);
BartJanssens 0:785cff1e5a7c 314 }
BartJanssens 0:785cff1e5a7c 315
BartJanssens 0:785cff1e5a7c 316
BartJanssens 0:785cff1e5a7c 317 // --- Vec Arithmetic Operators -----------------------------------------------
BartJanssens 0:785cff1e5a7c 318
BartJanssens 0:785cff1e5a7c 319
BartJanssens 0:785cff1e5a7c 320 Vec operator + (const Vec &a, const Vec &b)
BartJanssens 0:785cff1e5a7c 321 {
BartJanssens 0:785cff1e5a7c 322 Assert(a.Elts() == b.Elts(), "(Vec::+) Vec sizes don't match");
BartJanssens 0:785cff1e5a7c 323
BartJanssens 0:785cff1e5a7c 324 Vec result(a.Elts());
BartJanssens 0:785cff1e5a7c 325 Int i;
BartJanssens 0:785cff1e5a7c 326
BartJanssens 0:785cff1e5a7c 327 for (i = 0; i < a.Elts(); i++)
BartJanssens 0:785cff1e5a7c 328 result[i] = a[i] + b[i];
BartJanssens 0:785cff1e5a7c 329
BartJanssens 0:785cff1e5a7c 330 return(result);
BartJanssens 0:785cff1e5a7c 331 }
BartJanssens 0:785cff1e5a7c 332
BartJanssens 0:785cff1e5a7c 333 Vec operator - (const Vec &a, const Vec &b)
BartJanssens 0:785cff1e5a7c 334 {
BartJanssens 0:785cff1e5a7c 335 Assert(a.Elts() == b.Elts(), "(Vec::-) Vec sizes don't match");
BartJanssens 0:785cff1e5a7c 336
BartJanssens 0:785cff1e5a7c 337 Vec result(a.Elts());
BartJanssens 0:785cff1e5a7c 338 Int i;
BartJanssens 0:785cff1e5a7c 339
BartJanssens 0:785cff1e5a7c 340 for (i = 0; i < a.Elts(); i++)
BartJanssens 0:785cff1e5a7c 341 result[i] = a[i] - b[i];
BartJanssens 0:785cff1e5a7c 342
BartJanssens 0:785cff1e5a7c 343 return(result);
BartJanssens 0:785cff1e5a7c 344 }
BartJanssens 0:785cff1e5a7c 345
BartJanssens 0:785cff1e5a7c 346 Vec operator - (const Vec &v)
BartJanssens 0:785cff1e5a7c 347 {
BartJanssens 0:785cff1e5a7c 348 Vec result(v.Elts());
BartJanssens 0:785cff1e5a7c 349 Int i;
BartJanssens 0:785cff1e5a7c 350
BartJanssens 0:785cff1e5a7c 351 for (i = 0; i < v.Elts(); i++)
BartJanssens 0:785cff1e5a7c 352 result[i] = - v[i];
BartJanssens 0:785cff1e5a7c 353
BartJanssens 0:785cff1e5a7c 354 return(result);
BartJanssens 0:785cff1e5a7c 355 }
BartJanssens 0:785cff1e5a7c 356
BartJanssens 0:785cff1e5a7c 357 Vec operator * (const Vec &a, const Vec &b)
BartJanssens 0:785cff1e5a7c 358 {
BartJanssens 0:785cff1e5a7c 359 Assert(a.Elts() == b.Elts(), "(Vec::*) Vec sizes don't match");
BartJanssens 0:785cff1e5a7c 360
BartJanssens 0:785cff1e5a7c 361 Vec result(a.Elts());
BartJanssens 0:785cff1e5a7c 362 Int i;
BartJanssens 0:785cff1e5a7c 363
BartJanssens 0:785cff1e5a7c 364 for (i = 0; i < a.Elts(); i++)
BartJanssens 0:785cff1e5a7c 365 result[i] = a[i] * b[i];
BartJanssens 0:785cff1e5a7c 366
BartJanssens 0:785cff1e5a7c 367 return(result);
BartJanssens 0:785cff1e5a7c 368 }
BartJanssens 0:785cff1e5a7c 369
BartJanssens 0:785cff1e5a7c 370 Vec operator * (const Vec &v, Real s)
BartJanssens 0:785cff1e5a7c 371 {
BartJanssens 0:785cff1e5a7c 372 Vec result(v.Elts());
BartJanssens 0:785cff1e5a7c 373 Int i;
BartJanssens 0:785cff1e5a7c 374
BartJanssens 0:785cff1e5a7c 375 for (i = 0; i < v.Elts(); i++)
BartJanssens 0:785cff1e5a7c 376 result[i] = v[i] * s;
BartJanssens 0:785cff1e5a7c 377
BartJanssens 0:785cff1e5a7c 378 return(result);
BartJanssens 0:785cff1e5a7c 379 }
BartJanssens 0:785cff1e5a7c 380
BartJanssens 0:785cff1e5a7c 381 Vec operator / (const Vec &a, const Vec &b)
BartJanssens 0:785cff1e5a7c 382 {
BartJanssens 0:785cff1e5a7c 383 Assert(a.Elts() == b.Elts(), "(Vec::/) Vec sizes don't match");
BartJanssens 0:785cff1e5a7c 384
BartJanssens 0:785cff1e5a7c 385 Vec result(a.Elts());
BartJanssens 0:785cff1e5a7c 386 Int i;
BartJanssens 0:785cff1e5a7c 387
BartJanssens 0:785cff1e5a7c 388 for (i = 0; i < a.Elts(); i++)
BartJanssens 0:785cff1e5a7c 389 result[i] = a[i] / b[i];
BartJanssens 0:785cff1e5a7c 390
BartJanssens 0:785cff1e5a7c 391 return(result);
BartJanssens 0:785cff1e5a7c 392 }
BartJanssens 0:785cff1e5a7c 393
BartJanssens 0:785cff1e5a7c 394 Vec operator / (const Vec &v, Real s)
BartJanssens 0:785cff1e5a7c 395 {
BartJanssens 0:785cff1e5a7c 396 Vec result(v.Elts());
BartJanssens 0:785cff1e5a7c 397 Int i;
BartJanssens 0:785cff1e5a7c 398
BartJanssens 0:785cff1e5a7c 399 for (i = 0; i < v.Elts(); i++)
BartJanssens 0:785cff1e5a7c 400 result[i] = v[i] / s;
BartJanssens 0:785cff1e5a7c 401
BartJanssens 0:785cff1e5a7c 402 return(result);
BartJanssens 0:785cff1e5a7c 403 }
BartJanssens 0:785cff1e5a7c 404
BartJanssens 0:785cff1e5a7c 405 Real dot(const Vec &a, const Vec &b)
BartJanssens 0:785cff1e5a7c 406 {
BartJanssens 0:785cff1e5a7c 407 Assert(a.Elts() == b.Elts(), "(Vec::dot) Vec sizes don't match");
BartJanssens 0:785cff1e5a7c 408
BartJanssens 0:785cff1e5a7c 409 Real sum = vl_zero;
BartJanssens 0:785cff1e5a7c 410 Int i;
BartJanssens 0:785cff1e5a7c 411
BartJanssens 0:785cff1e5a7c 412 for (i = 0; i < a.Elts(); i++)
BartJanssens 0:785cff1e5a7c 413 sum += a[i] * b[i];
BartJanssens 0:785cff1e5a7c 414
BartJanssens 0:785cff1e5a7c 415 return(sum);
BartJanssens 0:785cff1e5a7c 416 }
BartJanssens 0:785cff1e5a7c 417
BartJanssens 0:785cff1e5a7c 418 Vec operator * (Real s, const Vec &v)
BartJanssens 0:785cff1e5a7c 419 {
BartJanssens 0:785cff1e5a7c 420 Vec result(v.Elts());
BartJanssens 0:785cff1e5a7c 421 Int i;
BartJanssens 0:785cff1e5a7c 422
BartJanssens 0:785cff1e5a7c 423 for (i = 0; i < v.Elts(); i++)
BartJanssens 0:785cff1e5a7c 424 result[i] = v[i] * s;
BartJanssens 0:785cff1e5a7c 425
BartJanssens 0:785cff1e5a7c 426 return(result);
BartJanssens 0:785cff1e5a7c 427 }
BartJanssens 0:785cff1e5a7c 428
BartJanssens 0:785cff1e5a7c 429 Vec &Vec::Clamp(Real fuzz)
BartJanssens 0:785cff1e5a7c 430 // clamps all values of the matrix with a magnitude
BartJanssens 0:785cff1e5a7c 431 // smaller than fuzz to zero.
BartJanssens 0:785cff1e5a7c 432 {
BartJanssens 0:785cff1e5a7c 433 Int i;
BartJanssens 0:785cff1e5a7c 434
BartJanssens 0:785cff1e5a7c 435 for (i = 0; i < Elts(); i++)
BartJanssens 0:785cff1e5a7c 436 if (len(SELF[i]) < fuzz)
BartJanssens 0:785cff1e5a7c 437 SELF[i] = vl_zero;
BartJanssens 0:785cff1e5a7c 438
BartJanssens 0:785cff1e5a7c 439 return(SELF);
BartJanssens 0:785cff1e5a7c 440 }
BartJanssens 0:785cff1e5a7c 441
BartJanssens 0:785cff1e5a7c 442 Vec &Vec::Clamp()
BartJanssens 0:785cff1e5a7c 443 {
BartJanssens 0:785cff1e5a7c 444 return(Clamp(1e-7));
BartJanssens 0:785cff1e5a7c 445 }
BartJanssens 0:785cff1e5a7c 446
BartJanssens 0:785cff1e5a7c 447 Vec clamped(const Vec &v, Real fuzz)
BartJanssens 0:785cff1e5a7c 448 // clamps all values of the matrix with a magnitude
BartJanssens 0:785cff1e5a7c 449 // smaller than fuzz to zero.
BartJanssens 0:785cff1e5a7c 450 {
BartJanssens 0:785cff1e5a7c 451 Vec result(v);
BartJanssens 0:785cff1e5a7c 452
BartJanssens 0:785cff1e5a7c 453 return(result.Clamp(fuzz));
BartJanssens 0:785cff1e5a7c 454 }
BartJanssens 0:785cff1e5a7c 455
BartJanssens 0:785cff1e5a7c 456 Vec clamped(const Vec &v)
BartJanssens 0:785cff1e5a7c 457 {
BartJanssens 0:785cff1e5a7c 458 return(clamped(v, 1e-7));
BartJanssens 0:785cff1e5a7c 459 }
BartJanssens 0:785cff1e5a7c 460
BartJanssens 0:785cff1e5a7c 461
BartJanssens 0:785cff1e5a7c 462 // --- Vec Input & Output -----------------------------------------------------
BartJanssens 0:785cff1e5a7c 463
BartJanssens 0:785cff1e5a7c 464
BartJanssens 0:785cff1e5a7c 465 /*
BartJanssens 0:785cff1e5a7c 466 ostream &operator << (ostream &s, const Vec &v)
BartJanssens 0:785cff1e5a7c 467 {
BartJanssens 0:785cff1e5a7c 468 Int i, w;
BartJanssens 0:785cff1e5a7c 469
BartJanssens 0:785cff1e5a7c 470 s << '[';
BartJanssens 0:785cff1e5a7c 471
BartJanssens 0:785cff1e5a7c 472 if (v.Elts() > 0)
BartJanssens 0:785cff1e5a7c 473 {
BartJanssens 0:785cff1e5a7c 474 w = s.width();
BartJanssens 0:785cff1e5a7c 475 s << v[0];
BartJanssens 0:785cff1e5a7c 476
BartJanssens 0:785cff1e5a7c 477 for (i = 1; i < v.Elts(); i++)
BartJanssens 0:785cff1e5a7c 478 s << ' ' << setw(w) << v[i];
BartJanssens 0:785cff1e5a7c 479 }
BartJanssens 0:785cff1e5a7c 480
BartJanssens 0:785cff1e5a7c 481 s << ']';
BartJanssens 0:785cff1e5a7c 482
BartJanssens 0:785cff1e5a7c 483 return(s);
BartJanssens 0:785cff1e5a7c 484 }
BartJanssens 0:785cff1e5a7c 485 */
BartJanssens 0:785cff1e5a7c 486
BartJanssens 0:785cff1e5a7c 487 inline Void CopyPartialVec(const Vec &u, Vec &v, Int numElts)
BartJanssens 0:785cff1e5a7c 488 {
BartJanssens 0:785cff1e5a7c 489 for (Int i = 0; i < numElts; i++)
BartJanssens 0:785cff1e5a7c 490 v[i] = u[i];
BartJanssens 0:785cff1e5a7c 491 }
BartJanssens 0:785cff1e5a7c 492
BartJanssens 0:785cff1e5a7c 493 /*
BartJanssens 0:785cff1e5a7c 494 istream &operator >> (istream &s, Vec &v)
BartJanssens 0:785cff1e5a7c 495 {
BartJanssens 0:785cff1e5a7c 496 Int size = 0;
BartJanssens 0:785cff1e5a7c 497 Vec inVec(16);
BartJanssens 0:785cff1e5a7c 498 Char c;
BartJanssens 0:785cff1e5a7c 499
BartJanssens 0:785cff1e5a7c 500 // Expected format: [a b c d ...]
BartJanssens 0:785cff1e5a7c 501
BartJanssens 0:785cff1e5a7c 502 while (isspace(s.peek())) // chomp white space
BartJanssens 0:785cff1e5a7c 503 s.get(c);
BartJanssens 0:785cff1e5a7c 504
BartJanssens 0:785cff1e5a7c 505 if (s.peek() == '[')
BartJanssens 0:785cff1e5a7c 506 {
BartJanssens 0:785cff1e5a7c 507 s.get(c);
BartJanssens 0:785cff1e5a7c 508
BartJanssens 0:785cff1e5a7c 509
BartJanssens 0:785cff1e5a7c 510 while (isspace(s.peek())) // chomp white space
BartJanssens 0:785cff1e5a7c 511 s.get(c);
BartJanssens 0:785cff1e5a7c 512
BartJanssens 0:785cff1e5a7c 513 while (s.peek() != ']') // resize if needed
BartJanssens 0:785cff1e5a7c 514 {
BartJanssens 0:785cff1e5a7c 515 if (size == inVec.Elts())
BartJanssens 0:785cff1e5a7c 516 {
BartJanssens 0:785cff1e5a7c 517 Vec holdVec(inVec);
BartJanssens 0:785cff1e5a7c 518
BartJanssens 0:785cff1e5a7c 519 inVec.SetSize(size * 2);
BartJanssens 0:785cff1e5a7c 520 CopyPartialVec(holdVec, inVec, size);
BartJanssens 0:785cff1e5a7c 521 }
BartJanssens 0:785cff1e5a7c 522
BartJanssens 0:785cff1e5a7c 523 s >> inVec[size++]; // read an item
BartJanssens 0:785cff1e5a7c 524
BartJanssens 0:785cff1e5a7c 525 if (!s)
BartJanssens 0:785cff1e5a7c 526 {
BartJanssens 0:785cff1e5a7c 527 _Warning("Couldn't read vector element");
BartJanssens 0:785cff1e5a7c 528 return(s);
BartJanssens 0:785cff1e5a7c 529 }
BartJanssens 0:785cff1e5a7c 530
BartJanssens 0:785cff1e5a7c 531 while (isspace(s.peek())) // chomp white space
BartJanssens 0:785cff1e5a7c 532 s.get(c);
BartJanssens 0:785cff1e5a7c 533 }
BartJanssens 0:785cff1e5a7c 534 s.get(c);
BartJanssens 0:785cff1e5a7c 535 }
BartJanssens 0:785cff1e5a7c 536 else
BartJanssens 0:785cff1e5a7c 537 {
BartJanssens 0:785cff1e5a7c 538 s.clear(ios::failbit);
BartJanssens 0:785cff1e5a7c 539 _Warning("Error: Expected '[' while reading vector");
BartJanssens 0:785cff1e5a7c 540 return(s);
BartJanssens 0:785cff1e5a7c 541 }
BartJanssens 0:785cff1e5a7c 542
BartJanssens 0:785cff1e5a7c 543 v.SetSize(size);
BartJanssens 0:785cff1e5a7c 544 CopyPartialVec(inVec, v, size);
BartJanssens 0:785cff1e5a7c 545
BartJanssens 0:785cff1e5a7c 546 return(s);
BartJanssens 0:785cff1e5a7c 547 }
BartJanssens 0:785cff1e5a7c 548 */