1
// Wild Magic Source Code
3
// http://www.geometrictools.com
4
// Copyright (c) 1998-2007
6
// This library is free software; you can redistribute it and/or modify it
7
// under the terms of the GNU Lesser General Public License as published by
8
// the Free Software Foundation; either version 2.1 of the License, or (at
9
// your option) any later version. The license is available for reading at
10
// either of the locations:
11
// http://www.gnu.org/copyleft/lgpl.html
12
// http://www.geometrictools.com/License/WildMagicLicense.pdf
13
// The license applies to versions 0 through 4 of Wild Magic.
15
// Version: 4.0.0 (2006/06/28)
17
//----------------------------------------------------------------------------
19
GVector<Real>::GVector (int iSize)
24
m_afTuple = WM4_NEW Real[m_iSize];
25
memset(m_afTuple,0,m_iSize*sizeof(Real));
33
//----------------------------------------------------------------------------
35
GVector<Real>::GVector (int iSize, const Real* afTuple)
40
m_afTuple = WM4_NEW Real[m_iSize];
41
size_t uiSize = m_iSize*sizeof(Real);
42
System::Memcpy(m_afTuple,uiSize,afTuple,uiSize);
50
//----------------------------------------------------------------------------
52
GVector<Real>::GVector (const GVector& rkV)
54
m_iSize = rkV.m_iSize;
57
m_afTuple = WM4_NEW Real[m_iSize];
58
size_t uiSize = m_iSize*sizeof(Real);
59
System::Memcpy(m_afTuple,uiSize,rkV.m_afTuple,uiSize);
66
//----------------------------------------------------------------------------
68
GVector<Real>::~GVector ()
70
WM4_DELETE[] m_afTuple;
72
//----------------------------------------------------------------------------
74
void GVector<Real>::SetSize (int iSize)
76
WM4_DELETE[] m_afTuple;
80
m_afTuple = WM4_NEW Real[m_iSize];
81
memset(m_afTuple,0,m_iSize*sizeof(Real));
89
//----------------------------------------------------------------------------
91
int GVector<Real>::GetSize () const
95
//----------------------------------------------------------------------------
97
GVector<Real>::operator const Real* () const
101
//----------------------------------------------------------------------------
102
template <class Real>
103
GVector<Real>::operator Real* ()
107
//----------------------------------------------------------------------------
108
template <class Real>
109
Real GVector<Real>::operator[] (int i) const
111
assert(0 <= i && i < m_iSize);
114
//----------------------------------------------------------------------------
115
template <class Real>
116
Real& GVector<Real>::operator[] (int i)
118
assert(0 <= i && i < m_iSize);
121
//----------------------------------------------------------------------------
122
template <class Real>
123
GVector<Real>& GVector<Real>::operator= (const GVector& rkV)
127
if (m_iSize != rkV.m_iSize)
129
WM4_DELETE[] m_afTuple;
130
m_iSize = rkV.m_iSize;
131
m_afTuple = WM4_NEW Real[m_iSize];
133
size_t uiSize = m_iSize*sizeof(Real);
134
System::Memcpy(m_afTuple,uiSize,rkV.m_afTuple,uiSize);
138
WM4_DELETE[] m_afTuple;
144
//----------------------------------------------------------------------------
145
template <class Real>
146
int GVector<Real>::CompareArrays (const GVector& rkV) const
148
return memcmp(m_afTuple,rkV.m_afTuple,m_iSize*sizeof(Real));
150
//----------------------------------------------------------------------------
151
template <class Real>
152
bool GVector<Real>::operator== (const GVector& rkV) const
154
return CompareArrays(rkV) == 0;
156
//----------------------------------------------------------------------------
157
template <class Real>
158
bool GVector<Real>::operator!= (const GVector& rkV) const
160
return CompareArrays(rkV) != 0;
162
//----------------------------------------------------------------------------
163
template <class Real>
164
bool GVector<Real>::operator< (const GVector& rkV) const
166
return CompareArrays(rkV) < 0;
168
//----------------------------------------------------------------------------
169
template <class Real>
170
bool GVector<Real>::operator<= (const GVector& rkV) const
172
return CompareArrays(rkV) <= 0;
174
//----------------------------------------------------------------------------
175
template <class Real>
176
bool GVector<Real>::operator> (const GVector& rkV) const
178
return CompareArrays(rkV) > 0;
180
//----------------------------------------------------------------------------
181
template <class Real>
182
bool GVector<Real>::operator>= (const GVector& rkV) const
184
return CompareArrays(rkV) >= 0;
186
//----------------------------------------------------------------------------
187
template <class Real>
188
GVector<Real> GVector<Real>::operator+ (const GVector& rkV) const
190
GVector<Real> kSum(m_iSize);
191
for (int i = 0; i < m_iSize; i++)
193
kSum.m_afTuple[i] = m_afTuple[i] + rkV.m_afTuple[i];
197
//----------------------------------------------------------------------------
198
template <class Real>
199
GVector<Real> GVector<Real>::operator- (const GVector& rkV) const
201
GVector<Real> kDiff(m_iSize);
202
for (int i = 0; i < m_iSize; i++)
204
kDiff.m_afTuple[i] = m_afTuple[i] - rkV.m_afTuple[i];
208
//----------------------------------------------------------------------------
209
template <class Real>
210
GVector<Real> GVector<Real>::operator* (Real fScalar) const
212
GVector<Real> kProd(m_iSize);
213
for (int i = 0; i < m_iSize; i++)
215
kProd.m_afTuple[i] = fScalar*m_afTuple[i];
219
//----------------------------------------------------------------------------
220
template <class Real>
221
GVector<Real> GVector<Real>::operator/ (Real fScalar) const
223
GVector<Real> kQuot(m_iSize);
226
if (fScalar != (Real)0.0)
228
Real fInvScalar = ((Real)1.0)/fScalar;
229
for (i = 0; i < m_iSize; i++)
231
kQuot.m_afTuple[i] = fInvScalar*m_afTuple[i];
236
for (i = 0; i < m_iSize; i++)
238
kQuot.m_afTuple[i] = Math<Real>::MAX_REAL;
244
//----------------------------------------------------------------------------
245
template <class Real>
246
GVector<Real> GVector<Real>::operator- () const
248
GVector<Real> kNeg(m_iSize);
249
for (int i = 0; i < m_iSize; i++)
251
kNeg.m_afTuple[i] = -m_afTuple[i];
255
//----------------------------------------------------------------------------
256
template <class Real>
257
GVector<Real> operator* (Real fScalar, const GVector<Real>& rkV)
259
GVector<Real> kProd(rkV.GetSize());
260
for (int i = 0; i < rkV.GetSize(); i++)
262
kProd[i] = fScalar*rkV[i];
266
//----------------------------------------------------------------------------
267
template <class Real>
268
GVector<Real>& GVector<Real>::operator+= (const GVector& rkV)
270
for (int i = 0; i < m_iSize; i++)
272
m_afTuple[i] += rkV.m_afTuple[i];
276
//----------------------------------------------------------------------------
277
template <class Real>
278
GVector<Real>& GVector<Real>::operator-= (const GVector& rkV)
280
for (int i = 0; i < m_iSize; i++)
282
m_afTuple[i] -= rkV.m_afTuple[i];
286
//----------------------------------------------------------------------------
287
template <class Real>
288
GVector<Real>& GVector<Real>::operator*= (Real fScalar)
290
for (int i = 0; i < m_iSize; i++)
292
m_afTuple[i] *= fScalar;
296
//----------------------------------------------------------------------------
297
template <class Real>
298
GVector<Real>& GVector<Real>::operator/= (Real fScalar)
302
if (fScalar != (Real)0.0)
304
Real fInvScalar = ((Real)1.0)/fScalar;
305
for (i = 0; i < m_iSize; i++)
307
m_afTuple[i] *= fInvScalar;
312
for (i = 0; i < m_iSize; i++)
314
m_afTuple[i] = Math<Real>::MAX_REAL;
320
//----------------------------------------------------------------------------
321
template <class Real>
322
Real GVector<Real>::Length () const
324
Real fSqrLen = (Real)0.0;
325
for (int i = 0; i < m_iSize; i++)
327
fSqrLen += m_afTuple[i]*m_afTuple[i];
329
return Math<Real>::Sqrt(fSqrLen);
331
//----------------------------------------------------------------------------
332
template <class Real>
333
Real GVector<Real>::SquaredLength () const
335
Real fSqrLen = (Real)0.0;
336
for (int i = 0; i < m_iSize; i++)
338
fSqrLen += m_afTuple[i]*m_afTuple[i];
342
//----------------------------------------------------------------------------
343
template <class Real>
344
Real GVector<Real>::Dot (const GVector& rkV) const
346
Real fDot = (Real)0.0;
347
for (int i = 0; i < m_iSize; i++)
349
fDot += m_afTuple[i]*rkV.m_afTuple[i];
353
//----------------------------------------------------------------------------
354
template <class Real>
355
Real GVector<Real>::Normalize ()
357
Real fLength = Length();
360
if (fLength > Math<Real>::ZERO_TOLERANCE)
362
Real fInvLength = ((Real)1.0)/fLength;
363
for (i = 0; i < m_iSize; i++)
365
m_afTuple[i] *= fInvLength;
371
for (i = 0; i < m_iSize; i++)
373
m_afTuple[i] = (Real)0.0;
379
//----------------------------------------------------------------------------