ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/math/Vector.hpp
Revision: 1594
Committed: Mon Oct 18 23:13:23 2004 UTC (19 years, 8 months ago) by tim
Original Path: trunk/OOPSE-3.0/src/math/Vector.hpp
File size: 14663 byte(s)
Log Message:
more tests on math library

File Contents

# User Rev Content
1 tim 1563 /*
2     * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project
3     *
4     * Contact: oopse@oopse.org
5     *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU Lesser General Public License
8     * as published by the Free Software Foundation; either version 2.1
9     * of the License, or (at your option) any later version.
10     * All we ask is that proper credit is given for our work, which includes
11     * - but is not limited to - adding the above copyright notice to the beginning
12     * of your source code files, and to any copyright notice that you may distribute
13     * with programs based on this work.
14     *
15     * This program is distributed in the hope that it will be useful,
16     * but WITHOUT ANY WARRANTY; without even the implied warranty of
17     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18     * GNU Lesser General Public License for more details.
19     *
20     * You should have received a copy of the GNU Lesser General Public License
21     * along with this program; if not, write to the Free Software
22     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23     *
24     */
25    
26     /**
27     * @file Vector.hpp
28     * @author Teng Lin
29     * @date 09/14/2004
30     * @version 1.0
31     */
32    
33     #ifndef MATH_VECTOR_HPP
34     #define MATH_VECTOR_HPP
35    
36     #include <cassert>
37     #include <cmath>
38 tim 1564 #include <iostream>
39 tim 1563
40     namespace oopse {
41    
42 tim 1569 const double epsilon = 0.000001;
43    
44     template<typename T>
45     inline bool equal(T e1, T e2) {
46     return e1 == e2;
47     }
48    
49     template<>
50     inline bool equal(float e1, float e2) {
51     return fabs(e1 - e2) < epsilon;
52     }
53    
54     template<>
55     inline bool equal(double e1, double e2) {
56     return fabs(e1 - e2) < epsilon;
57     }
58    
59 tim 1563 /**
60     * @class Vector Vector.hpp "math/Vector.hpp"
61     * @brief Fix length vector class
62     */
63 tim 1564 template<typename Real, unsigned int Dim>
64 tim 1563 class Vector{
65     public:
66    
67     /** default constructor */
68     inline Vector(){
69     for (unsigned int i = 0; i < Dim; i++)
70     data_[i] = 0.0;
71     }
72    
73     /** Constructs and initializes a Vector from a vector */
74     inline Vector(const Vector<Real, Dim>& v) {
75     *this = v;
76     }
77    
78     /** copy assignment operator */
79     inline Vector<Real, Dim>& operator=(const Vector<Real, Dim>& v) {
80     if (this == &v)
81     return *this;
82    
83     for (unsigned int i = 0; i < Dim; i++)
84     data_[i] = v[i];
85    
86     return *this;
87     }
88 tim 1594
89     template<typename T>
90     inline Vector(const T& s){
91     for (unsigned int i = 0; i < Dim; i++)
92     data_[i] = s;
93     }
94 tim 1563
95     /** Constructs and initializes a Vector from an array */
96     inline Vector( double* v) {
97 tim 1586 for (unsigned int i = 0; i < Dim; i++)
98     data_[i] = v[i];
99 tim 1563 }
100    
101     /**
102     * Returns reference of ith element.
103     * @return reference of ith element
104     * @param i index
105     */
106     inline double& operator[](unsigned int i) {
107     assert( i < Dim);
108     return data_[i];
109     }
110    
111     /**
112     * Returns reference of ith element.
113     * @return reference of ith element
114     * @param i index
115     */
116     inline double& operator()(unsigned int i) {
117     assert( i < Dim);
118     return data_[i];
119     }
120    
121     /**
122     * Returns constant reference of ith element.
123     * @return reference of ith element
124     * @param i index
125     */
126     inline const double& operator[](unsigned int i) const {
127     assert( i < Dim);
128     return data_[i];
129     }
130    
131     /**
132     * Returns constant reference of ith element.
133     * @return reference of ith element
134     * @param i index
135     */
136     inline const double& operator()(unsigned int i) const {
137     assert( i < Dim);
138     return data_[i];
139     }
140    
141 tim 1569 /**
142     * Tests if this vetor is equal to other vector
143     * @return true if equal, otherwise return false
144     * @param v vector to be compared
145     */
146     inline bool operator ==(const Vector<Real, Dim>& v) {
147    
148     for (unsigned int i = 0; i < Dim; i ++) {
149     if (!equal(data_[i], v[i])) {
150     return false;
151     }
152     }
153    
154     return true;
155     }
156    
157     /**
158     * Tests if this vetor is not equal to other vector
159     * @return true if equal, otherwise return false
160     * @param v vector to be compared
161     */
162     inline bool operator !=(const Vector<Real, Dim>& v) {
163     return !(*this == v);
164     }
165    
166 tim 1563 /** Negates the value of this vector in place. */
167     inline void negate() {
168 tim 1594 for (unsigned int i = 0; i < Dim; i++)
169     data_[i] = -data_[i];
170 tim 1563 }
171    
172     /**
173     * Sets the value of this vector to the negation of vector v1.
174     * @param v1 the source vector
175     */
176     inline void negate(const Vector<Real, Dim>& v1) {
177     for (unsigned int i = 0; i < Dim; i++)
178     data_[i] = -v1.data_[i];
179    
180     }
181    
182     /**
183     * Sets the value of this vector to the sum of itself and v1 (*this += v1).
184     * @param v1 the other vector
185     */
186     inline void add( const Vector<Real, Dim>& v1 ) {
187 tim 1586 for (unsigned int i = 0; i < Dim; i++)
188     data_[i] += v1.data_[i];
189 tim 1563 }
190    
191     /**
192     * Sets the value of this vector to the sum of v1 and v2 (*this = v1 + v2).
193     * @param v1 the first vector
194     * @param v2 the second vector
195     */
196     inline void add( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
197 tim 1586 for (unsigned int i = 0; i < Dim; i++)
198     data_[i] = v1.data_[i] + v2.data_[i];
199 tim 1563 }
200    
201     /**
202     * Sets the value of this vector to the difference of itself and v1 (*this -= v1).
203     * @param v1 the other vector
204     */
205     inline void sub( const Vector<Real, Dim>& v1 ) {
206     for (unsigned int i = 0; i < Dim; i++)
207     data_[i] -= v1.data_[i];
208     }
209    
210     /**
211     * Sets the value of this vector to the difference of vector v1 and v2 (*this = v1 - v2).
212     * @param v1 the first vector
213     * @param v2 the second vector
214     */
215     inline void sub( const Vector<Real, Dim>& v1, const Vector &v2 ){
216     for (unsigned int i = 0; i < Dim; i++)
217     data_[i] = v1.data_[i] - v2.data_[i];
218     }
219    
220     /**
221     * Sets the value of this vector to the scalar multiplication of itself (*this *= s).
222     * @param s the scalar value
223     */
224     inline void mul( double s ) {
225 tim 1586 for (unsigned int i = 0; i < Dim; i++)
226 tim 1563 data_[i] *= s;
227     }
228    
229     /**
230     * Sets the value of this vector to the scalar multiplication of vector v1
231     * (*this = s * v1).
232 tim 1594 * @param v1 the vector
233 tim 1563 * @param s the scalar value
234     */
235 tim 1594 inline void mul( const Vector<Real, Dim>& v1, double s) {
236 tim 1586 for (unsigned int i = 0; i < Dim; i++)
237 tim 1563 data_[i] = s * v1.data_[i];
238     }
239    
240     /**
241     * Sets the value of this vector to the scalar division of itself (*this /= s ).
242     * @param s the scalar value
243     */
244     inline void div( double s) {
245 tim 1586 for (unsigned int i = 0; i < Dim; i++)
246 tim 1563 data_[i] /= s;
247     }
248    
249     /**
250     * Sets the value of this vector to the scalar division of vector v1 (*this = v1 / s ).
251     * @param v1 the source vector
252     * @param s the scalar value
253     */
254     inline void div( const Vector<Real, Dim>& v1, double s ) {
255 tim 1586 for (unsigned int i = 0; i < Dim; i++)
256 tim 1563 data_[i] = v1.data_[i] / s;
257     }
258    
259     /** @see #add */
260 tim 1564 inline Vector<Real, Dim>& operator +=( const Vector<Real, Dim>& v1 ) {
261 tim 1563 add(v1);
262     return *this;
263     }
264    
265     /** @see #sub */
266 tim 1564 inline Vector<Real, Dim>& operator -=( const Vector<Real, Dim>& v1 ) {
267 tim 1563 sub(v1);
268     return *this;
269     }
270    
271     /** @see #mul */
272 tim 1564 inline Vector<Real, Dim>& operator *=( double s) {
273 tim 1563 mul(s);
274     return *this;
275     }
276    
277     /** @see #div */
278 tim 1564 inline Vector<Real, Dim>& operator /=( double s ) {
279 tim 1563 div(s);
280     return *this;
281     }
282    
283     /**
284     * Returns the length of this vector.
285     * @return the length of this vector
286     */
287     inline double length() {
288     return sqrt(lengthSquared());
289     }
290    
291     /**
292     * Returns the squared length of this vector.
293     * @return the squared length of this vector
294     */
295 tim 1586 inline double lengthSquare() {
296 tim 1563 return dot(*this, *this);
297     }
298    
299     /** Normalizes this vector in place */
300     inline void normalize() {
301     double len;
302    
303     len = length();
304     *this /= len;
305     }
306 tim 1586
307     /**
308     * Tests if this vector is normalized
309     * @return true if this vector is normalized, otherwise return false
310     */
311     inline bool isNormalized() const
312     {
313     return lengthSquare() == 1.0;
314     }
315 tim 1563
316     protected:
317 tim 1594 double data_[Dim];
318 tim 1563
319     };
320    
321     /** unary minus*/
322 tim 1564 template<typename Real, unsigned int Dim>
323 tim 1563 inline Vector<Real, Dim> operator -(const Vector<Real, Dim>& v1){
324 tim 1594 Vector<Real, Dim> tmp(v1);
325     tmp.negate();
326     return tmp;
327 tim 1563 }
328    
329     /**
330     * Return the sum of two vectors (v1 - v2).
331     * @return the sum of two vectors
332     * @param v1 the first vector
333     * @param v2 the second vector
334     */
335 tim 1564 template<typename Real, unsigned int Dim>
336 tim 1563 inline Vector<Real, Dim> operator +(const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2) {
337     Vector<Real, Dim> result;
338    
339     result.add(v1, v2);
340     return result;
341     }
342    
343     /**
344     * Return the difference of two vectors (v1 - v2).
345     * @return the difference of two vectors
346     * @param v1 the first vector
347     * @param v2 the second vector
348     */
349 tim 1564 template<typename Real, unsigned int Dim>
350 tim 1563 Vector<Real, Dim> operator -(const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2) {
351     Vector<Real, Dim> result;
352     result.sub(v1, v2);
353     return result;
354     }
355    
356     /**
357     * Returns the vaule of scalar multiplication of this vector v1 (v1 * r).
358     * @return the vaule of scalar multiplication of this vector
359     * @param v1 the source vector
360     * @param s the scalar value
361     */
362 tim 1564 template<typename Real, unsigned int Dim>
363 tim 1563 Vector<Real, Dim> operator * ( const Vector<Real, Dim>& v1, double s) {
364     Vector<Real, Dim> result;
365 tim 1594 result.mul(v1,s);
366 tim 1563 return result;
367     }
368    
369     /**
370     * Returns the vaule of scalar multiplication of this vector v1 (v1 * r).
371     * @return the vaule of scalar multiplication of this vector
372     * @param s the scalar value
373     * @param v1 the source vector
374     */
375 tim 1564 template<typename Real, unsigned int Dim>
376 tim 1563 Vector<Real, Dim> operator * ( double s, const Vector<Real, Dim>& v1 ) {
377     Vector<Real, Dim> result;
378 tim 1594 result.mul(v1, s);
379 tim 1563 return result;
380     }
381    
382     /**
383     * Returns the value of division of a vector by a scalar.
384     * @return the vaule of scalar division of this vector
385     * @param v1 the source vector
386     * @param s the scalar value
387     */
388 tim 1564 template<typename Real, unsigned int Dim>
389 tim 1563 Vector<Real, Dim> operator / ( const Vector<Real, Dim>& v1, double s) {
390     Vector<Real, Dim> result;
391     result.div( v1,s);
392     return result;
393     }
394    
395     /** fuzzy comparson */
396 tim 1564 template<typename Real, unsigned int Dim>
397 tim 1563 inline bool epsilonEqual( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
398    
399     }
400    
401    
402     /**
403     * Returns the dot product of two Vectors
404     * @param v1 first vector
405     * @param v2 second vector
406     * @return the dot product of v1 and v2
407     */
408 tim 1564 template<typename Real, unsigned int Dim>
409 tim 1563 inline Real dot( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
410 tim 1586 Real tmp;
411     tmp = 0;
412 tim 1563
413 tim 1586 for (unsigned int i = 0; i < Dim; i++)
414     tmp += v1[i] + v2[i];
415    
416     return tmp;
417 tim 1563 }
418    
419     /**
420     * Returns the distance between two Vectors
421     * @param v1 first vector
422     * @param v2 second vector
423     * @return the distance between v1 and v2
424     */
425 tim 1564 template<typename Real, unsigned int Dim>
426 tim 1563 inline Real distance( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
427     Vector<Real, Dim> tempVector = v1 - v2;
428     return tempVector.length();
429     }
430    
431     /**
432     * Returns the squared distance between two Vectors
433     * @param v1 first vector
434     * @param v2 second vector
435     * @return the squared distance between v1 and v2
436     */
437 tim 1564 template<typename Real, unsigned int Dim>
438 tim 1563 inline Real distanceSquare( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
439     Vector<Real, Dim> tempVector = v1 - v2;
440     return tempVector.lengthSquare();
441     }
442    
443     /**
444     * Write to an output stream
445     */
446 tim 1564 template<typename Real, unsigned int Dim>
447 tim 1586 std::ostream &operator<< ( std::ostream& o, const Vector<Real, Dim>& v) {
448    
449     o << "[" << v[0] << ", " << v[1] << ", " << v[2] << "]" << endl;
450 tim 1563 return o;
451     }
452    
453     }
454     #endif