ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/math/Vector.hpp
(Generate patch)

Comparing trunk/OOPSE-4/src/math/Vector.hpp (file contents):
Revision 1586 by tim, Sun Oct 17 01:19:11 2004 UTC vs.
Revision 2588 by tim, Fri Feb 10 15:12:14 2006 UTC

# Line 1 | Line 1
1   /*
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.
2 > * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3   *
4 + * The University of Notre Dame grants you ("Licensee") a
5 + * non-exclusive, royalty free, license to use, modify and
6 + * redistribute this software in source and binary code form, provided
7 + * that the following conditions are met:
8 + *
9 + * 1. Acknowledgement of the program authors must be made in any
10 + *    publication of scientific results based in part on use of the
11 + *    program.  An acceptable form of acknowledgement is citation of
12 + *    the article in which the program was described (Matthew
13 + *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 + *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 + *    Parallel Simulation Engine for Molecular Dynamics,"
16 + *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 + *
18 + * 2. Redistributions of source code must retain the above copyright
19 + *    notice, this list of conditions and the following disclaimer.
20 + *
21 + * 3. Redistributions in binary form must reproduce the above copyright
22 + *    notice, this list of conditions and the following disclaimer in the
23 + *    documentation and/or other materials provided with the
24 + *    distribution.
25 + *
26 + * This software is provided "AS IS," without a warranty of any
27 + * kind. All express or implied conditions, representations and
28 + * warranties, including any implied warranty of merchantability,
29 + * fitness for a particular purpose or non-infringement, are hereby
30 + * excluded.  The University of Notre Dame and its licensors shall not
31 + * be liable for any damages suffered by licensee as a result of
32 + * using, modifying or distributing the software or its
33 + * derivatives. In no event will the University of Notre Dame or its
34 + * licensors be liable for any lost revenue, profit or data, or for
35 + * direct, indirect, special, consequential, incidental or punitive
36 + * damages, however caused and regardless of the theory of liability,
37 + * arising out of the use of or inability to use software, even if the
38 + * University of Notre Dame has been advised of the possibility of
39 + * such damages.
40   */
41 <
41 >
42   /**
43   * @file Vector.hpp
44   * @author Teng Lin
# Line 36 | Line 52
52   #include <cassert>
53   #include <cmath>
54   #include <iostream>
55 <
55 > #include <math.h>
56   namespace oopse {
57  
58 <    const double epsilon = 0.000001;
58 >  static const double epsilon = 0.000001;
59  
60 <    template<typename T>
61 <    inline bool equal(T e1, T e2) {
62 <        return e1 == e2;
63 <    }
60 >  template<typename T>
61 >  inline bool equal(T e1, T e2) {
62 >    return e1 == e2;
63 >  }
64  
65 <    template<>
66 <    inline bool equal(float e1, float e2) {
67 <        return fabs(e1 - e2) < epsilon;
68 <    }
65 >  template<>
66 >  inline bool equal(float e1, float e2) {
67 >    return fabs(e1 - e2) < epsilon;
68 >  }
69  
70 <    template<>
71 <    inline bool equal(double e1, double e2) {
72 <        return fabs(e1 - e2) < epsilon;
73 <    }
70 >  template<>
71 >  inline bool equal(double e1, double e2) {
72 >    return fabs(e1 - e2) < epsilon;
73 >  }
74 >
75      
76 <    /**
77 <     * @class Vector Vector.hpp "math/Vector.hpp"
78 <     * @brief Fix length vector class
79 <     */
80 <    template<typename Real, unsigned int Dim>
81 <    class Vector{
82 <        public:
76 >  /**
77 >   * @class Vector Vector.hpp "math/Vector.hpp"
78 >   * @brief Fix length vector class
79 >   */
80 >  template<typename Real, unsigned int Dim>
81 >  class Vector{
82 >  public:
83  
84 <            /** default constructor */
85 <            inline Vector(){
69 <                for (unsigned int i = 0; i < Dim; i++)
70 <                    data_[i] = 0.0;
71 <            }
84 >    typedef Real ElemType;
85 >    typedef Real* ElemPoinerType;
86  
87 <            /** Constructs and initializes a Vector from a vector */
88 <            inline Vector(const Vector<Real, Dim>& v) {
89 <                *this  = v;
90 <            }
87 >    /** default constructor */
88 >    inline Vector(){
89 >      for (unsigned int i = 0; i < Dim; i++)
90 >        this->data_[i] = 0;
91 >    }
92  
93 <            /** copy assignment operator */
94 <            inline Vector<Real, Dim>& operator=(const Vector<Real, Dim>& v) {
95 <                if (this == &v)
96 <                    return *this;
93 >    /** Constructs and initializes a Vector from a vector */
94 >    inline Vector(const Vector<Real, Dim>& v) {
95 >      *this  = v;
96 >    }
97 >
98 >    /** copy assignment operator */
99 >    inline Vector<Real, Dim>& operator=(const Vector<Real, Dim>& v) {
100 >      if (this == &v)
101 >        return *this;
102                  
103 <                for (unsigned int i = 0; i < Dim; i++)            
104 <                    data_[i] = v[i];
103 >      for (unsigned int i = 0; i < Dim; i++)            
104 >        this->data_[i] = v[i];
105                  
106 <                return *this;
107 <            }
106 >      return *this;
107 >    }
108 >
109 >    template<typename T>
110 >    inline Vector(const T& s){
111 >      for (unsigned int i = 0; i < Dim; i++)
112 >        this->data_[i] = s;
113 >    }
114              
115 <            /** Constructs and initializes a Vector from an array */            
116 <            inline Vector( double* v) {
117 <                for (unsigned int i = 0; i < Dim; i++)
118 <                    data_[i] = v[i];
119 <            }
115 >    /** Constructs and initializes a Vector from an array */            
116 >    inline Vector( Real* v) {
117 >      for (unsigned int i = 0; i < Dim; i++)
118 >        this->data_[i] = v[i];
119 >    }
120  
121 <            /**
122 <             * Returns reference of ith element.
123 <             * @return reference of ith element
124 <             * @param i index
125 <             */
126 <            inline double& operator[](unsigned int  i) {
127 <                assert( i < Dim);
128 <                return data_[i];
129 <            }
121 >    /**
122 >     * Returns reference of ith element.
123 >     * @return reference of ith element
124 >     * @param i index
125 >     */
126 >    inline Real& operator[](unsigned int  i) {
127 >      assert( i < Dim);
128 >      return this->data_[i];
129 >    }
130  
131 <            /**
132 <             * Returns reference of ith element.
133 <             * @return reference of ith element
134 <             * @param i index
135 <             */
136 <            inline double& operator()(unsigned int  i) {
137 <                assert( i < Dim);
138 <                return data_[i];
139 <            }
131 >    /**
132 >     * Returns reference of ith element.
133 >     * @return reference of ith element
134 >     * @param i index
135 >     */
136 >    inline Real& operator()(unsigned int  i) {
137 >      assert( i < Dim);
138 >      return this->data_[i];
139 >    }
140  
141 <            /**
142 <             * Returns constant reference of ith element.
143 <             * @return reference of ith element
144 <             * @param i index
145 <             */
146 <            inline  const double& operator[](unsigned int i) const {
147 <                assert( i < Dim);
148 <                return data_[i];
149 <            }
141 >    /**
142 >     * Returns constant reference of ith element.
143 >     * @return reference of ith element
144 >     * @param i index
145 >     */
146 >    inline  const Real& operator[](unsigned int i) const {
147 >      assert( i < Dim);
148 >      return this->data_[i];
149 >    }
150  
151 <            /**
152 <             * Returns constant reference of ith element.
153 <             * @return reference of ith element
154 <             * @param i index
155 <             */
156 <            inline  const double& operator()(unsigned int i) const {
157 <                assert( i < Dim);
158 <                return data_[i];
159 <            }
151 >    /**
152 >     * Returns constant reference of ith element.
153 >     * @return reference of ith element
154 >     * @param i index
155 >     */
156 >    inline  const Real& operator()(unsigned int i) const {
157 >      assert( i < Dim);
158 >      return this->data_[i];
159 >    }
160  
161 <            /**
162 <             * Tests if this vetor is equal to other vector
163 <             * @return true if equal, otherwise return false
164 <             * @param v vector to be compared
165 <             */
166 <             inline bool operator ==(const Vector<Real, Dim>& v) {
161 >    /** Copy the internal data to an array*/
162 >    void getArray(Real* array) {
163 >      for (unsigned int i = 0; i < Dim; i ++) {
164 >        array[i] = this->data_[i];
165 >      }                
166 >    }
167  
168 <                for (unsigned int i = 0; i < Dim; i ++) {
169 <                    if (!equal(data_[i], v[i])) {
170 <                        return false;
171 <                    }
172 <                }
168 >    /** Returns the pointer of internal array */
169 >    Real* getArrayPointer() {
170 >      return this->data_;
171 >    }
172 >            
173 >    /**
174 >     * Tests if this vetor is equal to other vector
175 >     * @return true if equal, otherwise return false
176 >     * @param v vector to be compared
177 >     */
178 >    inline bool operator ==(const Vector<Real, Dim>& v) {
179 >
180 >      for (unsigned int i = 0; i < Dim; i ++) {
181 >        if (!equal(this->data_[i], v[i])) {
182 >          return false;
183 >        }
184 >      }
185                  
186 <                return true;
187 <            }
186 >      return true;
187 >    }
188  
189 <            /**
190 <             * Tests if this vetor is not equal to other vector
191 <             * @return true if equal, otherwise return false
192 <             * @param v vector to be compared
193 <             */
194 <            inline bool operator !=(const Vector<Real, Dim>& v) {
195 <                return !(*this == v);
196 <            }
189 >    /**
190 >     * Tests if this vetor is not equal to other vector
191 >     * @return true if equal, otherwise return false
192 >     * @param v vector to be compared
193 >     */
194 >    inline bool operator !=(const Vector<Real, Dim>& v) {
195 >      return !(*this == v);
196 >    }
197              
198 <            /** Negates the value of this vector in place. */          
199 <            inline void negate() {
200 <                data_[0] = -data_[0];
201 <                data_[1] = -data_[1];
202 <                data_[2] = -data_[2];
165 <            }
198 >    /** Negates the value of this vector in place. */          
199 >    inline void negate() {
200 >      for (unsigned int i = 0; i < Dim; i++)
201 >        this->data_[i] = -this->data_[i];
202 >    }
203  
204 <            /**
205 <            * Sets the value of this vector to the negation of vector v1.
206 <            * @param v1 the source vector
207 <            */
208 <            inline void negate(const Vector<Real, Dim>& v1) {
209 <                for (unsigned int i = 0; i < Dim; i++)
210 <                    data_[i] = -v1.data_[i];
204 >    /**
205 >     * Sets the value of this vector to the negation of vector v1.
206 >     * @param v1 the source vector
207 >     */
208 >    inline void negate(const Vector<Real, Dim>& v1) {
209 >      for (unsigned int i = 0; i < Dim; i++)
210 >        this->data_[i] = -v1.data_[i];
211  
212 <            }
212 >    }
213              
214 <            /**
215 <            * Sets the value of this vector to the sum of itself and v1 (*this += v1).
216 <            * @param v1 the other vector
217 <            */
218 <            inline void add( const Vector<Real, Dim>& v1 ) {
219 <            for (unsigned int i = 0; i < Dim; i++)
220 <                data_[i] += v1.data_[i];
184 <                }
185 <
186 <            /**
187 <            * Sets the value of this vector to the sum of v1 and v2 (*this = v1 + v2).
188 <            * @param v1 the first vector
189 <            * @param v2 the second vector
190 <            */
191 <            inline void add( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
192 <                for (unsigned int i = 0; i < Dim; i++)
193 <                    data_[i] = v1.data_[i] + v2.data_[i];
194 <            }
195 <
196 <            /**
197 <            * Sets the value of this vector to the difference  of itself and v1 (*this -= v1).
198 <            * @param v1 the other vector
199 <            */
200 <            inline void sub( const Vector<Real, Dim>& v1 ) {
201 <                for (unsigned int i = 0; i < Dim; i++)
202 <                    data_[i] -= v1.data_[i];
203 <            }
204 <
205 <            /**
206 <            * Sets the value of this vector to the difference of vector v1 and v2 (*this = v1 - v2).
207 <            * @param v1 the first vector
208 <            * @param v2 the second vector
209 <            */
210 <            inline void sub( const Vector<Real, Dim>& v1, const Vector  &v2 ){
211 <                for (unsigned int i = 0; i < Dim; i++)
212 <                    data_[i] = v1.data_[i] - v2.data_[i];
213 <            }
214 <
215 <            /**
216 <            * Sets the value of this vector to the scalar multiplication of itself (*this *= s).
217 <            * @param s the scalar value
218 <            */
219 <            inline void mul( double s ) {
220 <                for (unsigned int i = 0; i < Dim; i++)
221 <                   data_[i] *= s;
222 <            }
223 <
224 <            /**
225 <            * Sets the value of this vector to the scalar multiplication of vector v1  
226 <            * (*this = s * v1).
227 <            * @param s the scalar value
228 <            * @param v1 the vector
229 <            */
230 <            inline void mul( double s, const Vector<Real, Dim>& v1 ) {
231 <                for (unsigned int i = 0; i < Dim; i++)
232 <                    data_[i] = s * v1.data_[i];
233 <            }
234 <
235 <            /**
236 <            * Sets the value of this vector to the scalar division of itself  (*this /= s ).
237 <            * @param s the scalar value
238 <            */            
239 <            inline void div( double s) {
240 <                for (unsigned int i = 0; i < Dim; i++)            
241 <                    data_[i] /= s;
242 <            }
243 <
244 <            /**
245 <            * Sets the value of this vector to the scalar division of vector v1  (*this = v1 / s ).
246 <            * @param v1 the source vector
247 <            * @param s the scalar value
248 <            */                        
249 <            inline void div( const Vector<Real, Dim>& v1, double s ) {
250 <                for (unsigned int i = 0; i < Dim; i++)
251 <                    data_[i] = v1.data_[i] / s;
252 <            }
253 <
254 <            /** @see #add */
255 <            inline Vector<Real, Dim>& operator +=( const Vector<Real, Dim>& v1 ) {
256 <                add(v1);
257 <                return *this;
258 <            }
259 <
260 <            /** @see #sub */
261 <            inline Vector<Real, Dim>& operator -=( const Vector<Real, Dim>& v1 ) {
262 <                sub(v1);
263 <                return *this;
264 <            }
265 <
266 <            /** @see #mul */
267 <            inline Vector<Real, Dim>& operator *=( double s) {
268 <                mul(s);
269 <                return *this;
270 <            }
271 <
272 <            /** @see #div */
273 <            inline Vector<Real, Dim>& operator /=( double s ) {
274 <                div(s);
275 <                return *this;
276 <            }
277 <
278 <            /**
279 <             * Returns the length of this vector.
280 <             * @return the length of this vector
281 <             */
282 <             inline double length() {
283 <                return sqrt(lengthSquared());  
284 <            }
285 <            
286 <            /**
287 <             * Returns the squared length of this vector.
288 <             * @return the squared length of this vector
289 <             */
290 <             inline double lengthSquare() {
291 <                return dot(*this, *this);
292 <            }
293 <            
294 <            /** Normalizes this vector in place */
295 <            inline void normalize() {
296 <                double len;
297 <
298 <                len = length();
299 <                *this /= len;
300 <            }
301 <
302 <            /**
303 <             * Tests if this vector is normalized
304 <             * @return true if this vector is normalized, otherwise return false
305 <             */
306 <            inline bool isNormalized() const
307 <            {
308 <                return lengthSquare() == 1.0;
309 <            }          
310 <            
311 <        protected:
312 <            double data_[3];
313 <        
314 <    };
315 <
316 <    /** unary minus*/
317 <    template<typename Real, unsigned int Dim>    
318 <    inline Vector<Real, Dim> operator -(const Vector<Real, Dim>& v1){
319 <        Vector tmp(v1);
320 <        return tmp.negate();
214 >    /**
215 >     * Sets the value of this vector to the sum of itself and v1 (*this += v1).
216 >     * @param v1 the other vector
217 >     */
218 >    inline void add( const Vector<Real, Dim>& v1 ) {
219 >      for (unsigned int i = 0; i < Dim; i++)
220 >        this->data_[i] += v1.data_[i];
221      }
222  
223      /**
224 <     * Return the sum of two vectors  (v1 - v2).
325 <     * @return the sum of two vectors
224 >     * Sets the value of this vector to the sum of v1 and v2 (*this = v1 + v2).
225       * @param v1 the first vector
226       * @param v2 the second vector
227 <     */  
228 <    template<typename Real, unsigned int Dim>    
229 <    inline Vector<Real, Dim> operator +(const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2) {
230 <        Vector<Real, Dim> result;
332 <        
333 <        result.add(v1, v2);
334 <        return result;        
227 >     */
228 >    inline void add( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
229 >      for (unsigned int i = 0; i < Dim; i++)
230 >        this->data_[i] = v1.data_[i] + v2.data_[i];
231      }
232  
233      /**
234 <     * Return the difference of two vectors  (v1 - v2).
235 <     * @return the difference of two vectors
234 >     * Sets the value of this vector to the difference  of itself and v1 (*this -= v1).
235 >     * @param v1 the other vector
236 >     */
237 >    inline void sub( const Vector<Real, Dim>& v1 ) {
238 >      for (unsigned int i = 0; i < Dim; i++)
239 >        this->data_[i] -= v1.data_[i];
240 >    }
241 >
242 >    /**
243 >     * Sets the value of this vector to the difference of vector v1 and v2 (*this = v1 - v2).
244       * @param v1 the first vector
245       * @param v2 the second vector
246 <     */  
247 <    template<typename Real, unsigned int Dim>    
248 <    Vector<Real, Dim> operator -(const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2) {
249 <        Vector<Real, Dim> result;
346 <        result.sub(v1, v2);
347 <        return result;        
246 >     */
247 >    inline void sub( const Vector<Real, Dim>& v1, const Vector  &v2 ){
248 >      for (unsigned int i = 0; i < Dim; i++)
249 >        this->data_[i] = v1.data_[i] - v2.data_[i];
250      }
251 <    
251 >
252      /**
253 <     * Returns the vaule of scalar multiplication of this vector v1 (v1 * r).
352 <     * @return  the vaule of scalar multiplication of this vector
353 <     * @param v1 the source vector
253 >     * Sets the value of this vector to the scalar multiplication of itself (*this *= s).
254       * @param s the scalar value
255 <     */
256 <    template<typename Real, unsigned int Dim>                
257 <    Vector<Real, Dim> operator * ( const Vector<Real, Dim>& v1, double s) {      
258 <        Vector<Real, Dim> result;
359 <        result.mul(s, v1);
360 <        return result;          
255 >     */
256 >    inline void mul( Real s ) {
257 >      for (unsigned int i = 0; i < Dim; i++)
258 >        this->data_[i] *= s;
259      }
260 <    
260 >
261      /**
262 <     * Returns the vaule of scalar multiplication of this vector v1 (v1 * r).
263 <     * @return  the vaule of scalar multiplication of this vector
262 >     * Sets the value of this vector to the scalar multiplication of vector v1  
263 >     * (*this = s * v1).
264 >     * @param v1 the vector            
265       * @param s the scalar value
266 <     * @param v1 the source vector
267 <     */  
268 <    template<typename Real, unsigned int Dim>
269 <    Vector<Real, Dim> operator * ( double s, const Vector<Real, Dim>& v1 ) {
371 <        Vector<Real, Dim> result;
372 <        result.mul(s, v1);
373 <        return result;          
266 >     */
267 >    inline void mul( const Vector<Real, Dim>& v1, Real s) {
268 >      for (unsigned int i = 0; i < Dim; i++)
269 >        this->data_[i] = s * v1.data_[i];
270      }
271  
272      /**
273 <     * Returns the  value of division of a vector by a scalar.
378 <     * @return  the vaule of scalar division of this vector
379 <     * @param v1 the source vector
273 >     * Sets the value of this vector to the scalar division of itself  (*this /= s ).
274       * @param s the scalar value
275 <     */
276 <    template<typename Real, unsigned int Dim>    
277 <    Vector<Real, Dim> operator / ( const Vector<Real, Dim>& v1, double s) {      
278 <        Vector<Real, Dim> result;
385 <        result.div( v1,s);
386 <        return result;          
275 >     */            
276 >    inline void div( Real s) {
277 >      for (unsigned int i = 0; i < Dim; i++)            
278 >        this->data_[i] /= s;
279      }
280 <    
280 >
281      /**
282 <     * Returns the  value of division of a vector by a scalar.
391 <     * @return  the vaule of scalar division of this vector
392 <     * @param s the scalar value
282 >     * Sets the value of this vector to the scalar division of vector v1  (*this = v1 / s ).
283       * @param v1 the source vector
284 <     */
285 <    template<typename Real, unsigned int Dim>        
286 <    inline Vector<Real, Dim> operator /( double s, const Vector<Real, Dim>& v1 ) {
287 <        Vector<Real, Dim> result;
288 <        result.div( v1,s);
399 <        return result;          
284 >     * @param s the scalar value
285 >     */                        
286 >    inline void div( const Vector<Real, Dim>& v1, Real s ) {
287 >      for (unsigned int i = 0; i < Dim; i++)
288 >        this->data_[i] = v1.data_[i] / s;
289      }
290  
291 <    /** fuzzy comparson */
292 <    template<typename Real, unsigned int Dim>        
293 <    inline bool epsilonEqual( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
291 >    /** @see #add */
292 >    inline Vector<Real, Dim>& operator +=( const Vector<Real, Dim>& v1 ) {
293 >      add(v1);
294 >      return *this;
295 >    }
296  
297 +    /** @see #sub */
298 +    inline Vector<Real, Dim>& operator -=( const Vector<Real, Dim>& v1 ) {
299 +      sub(v1);
300 +      return *this;
301      }
302  
303 <    
304 <    /**
305 <     * Returns the dot product of two Vectors
306 <     * @param v1 first vector
307 <     * @param v2 second vector
413 <     * @return the dot product of v1 and v2
414 <     */
415 <    template<typename Real, unsigned int Dim>    
416 <    inline Real dot( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
417 <        Real tmp;
418 <        tmp = 0;
303 >    /** @see #mul */
304 >    inline Vector<Real, Dim>& operator *=( Real s) {
305 >      mul(s);
306 >      return *this;
307 >    }
308  
309 <        for (unsigned int i = 0; i < Dim; i++)
310 <            tmp += v1[i] + v2[i];
311 <
312 <        return tmp;
309 >    /** @see #div */
310 >    inline Vector<Real, Dim>& operator /=( Real s ) {
311 >      div(s);
312 >      return *this;
313      }
314  
315      /**
316 <     * Returns the distance between  two Vectors
317 <     * @param v1 first vector
318 <     * @param v2 second vector
319 <     * @return the distance between v1 and v2
320 <     */
432 <    template<typename Real, unsigned int Dim>    
433 <    inline Real distance( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
434 <        Vector<Real, Dim> tempVector = v1 - v2;
435 <        return tempVector.length();
316 >     * Returns the length of this vector.
317 >     * @return the length of this vector
318 >     */
319 >    inline Real length() {
320 >      return sqrt(lengthSquare());  
321      }
322 <
322 >            
323      /**
324 <     * Returns the squared distance between  two Vectors
325 <     * @param v1 first vector
441 <     * @param v2 second vector
442 <     * @return the squared distance between v1 and v2
324 >     * Returns the squared length of this vector.
325 >     * @return the squared length of this vector
326       */
327 <    template<typename Real, unsigned int Dim>
328 <    inline Real distanceSquare( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
446 <        Vector<Real, Dim> tempVector = v1 - v2;
447 <        return tempVector.lengthSquare();
327 >    inline Real lengthSquare() {
328 >      return dot(*this, *this);
329      }
330 +            
331 +    /** Normalizes this vector in place */
332 +    inline void normalize() {
333 +      Real len;
334  
335 +      len = length();
336 +                
337 +      //if (len < oopse:epsilon)
338 +      //  throw();
339 +                
340 +      *this /= len;
341 +    }
342 +
343      /**
344 <     * Write to an output stream
344 >     * Tests if this vector is normalized
345 >     * @return true if this vector is normalized, otherwise return false
346       */
347 <    template<typename Real, unsigned int Dim>
348 <    std::ostream &operator<< ( std::ostream& o, const Vector<Real, Dim>& v) {
347 >    inline bool isNormalized() {
348 >      return equal(lengthSquare(), 1.0);
349 >    }          
350  
351 <        o << "[" << v[0] << ", " << v[1] << ", " << v[2] << "]" << endl;
352 <        return o;        
351 >    unsigned int size() {return Dim;}
352 >  protected:
353 >    Real data_[Dim];
354 >        
355 >  };
356 >
357 >  /** unary minus*/
358 >  template<typename Real, unsigned int Dim>    
359 >  inline Vector<Real, Dim> operator -(const Vector<Real, Dim>& v1){
360 >    Vector<Real, Dim> tmp(v1);
361 >    tmp.negate();
362 >    return tmp;
363 >  }
364 >
365 >  /**
366 >   * Return the sum of two vectors  (v1 - v2).
367 >   * @return the sum of two vectors
368 >   * @param v1 the first vector
369 >   * @param v2 the second vector
370 >   */  
371 >  template<typename Real, unsigned int Dim>    
372 >  inline Vector<Real, Dim> operator +(const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2) {
373 >    Vector<Real, Dim> result;
374 >        
375 >    result.add(v1, v2);
376 >    return result;        
377 >  }
378 >
379 >  /**
380 >   * Return the difference of two vectors  (v1 - v2).
381 >   * @return the difference of two vectors
382 >   * @param v1 the first vector
383 >   * @param v2 the second vector
384 >   */  
385 >  template<typename Real, unsigned int Dim>    
386 >  Vector<Real, Dim> operator -(const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2) {
387 >    Vector<Real, Dim> result;
388 >    result.sub(v1, v2);
389 >    return result;        
390 >  }
391 >    
392 >  /**
393 >   * Returns the vaule of scalar multiplication of this vector v1 (v1 * r).
394 >   * @return  the vaule of scalar multiplication of this vector
395 >   * @param v1 the source vector
396 >   * @param s the scalar value
397 >   */
398 >  template<typename Real, unsigned int Dim>                
399 >  Vector<Real, Dim> operator * ( const Vector<Real, Dim>& v1, Real s) {      
400 >    Vector<Real, Dim> result;
401 >    result.mul(v1,s);
402 >    return result;          
403 >  }
404 >    
405 >  /**
406 >   * Returns the vaule of scalar multiplication of this vector v1 (v1 * r).
407 >   * @return  the vaule of scalar multiplication of this vector
408 >   * @param s the scalar value
409 >   * @param v1 the source vector
410 >   */  
411 >  template<typename Real, unsigned int Dim>
412 >  Vector<Real, Dim> operator * ( Real s, const Vector<Real, Dim>& v1 ) {
413 >    Vector<Real, Dim> result;
414 >    result.mul(v1, s);
415 >    return result;          
416 >  }
417 >
418 >  /**
419 >   * Returns the  value of division of a vector by a scalar.
420 >   * @return  the vaule of scalar division of this vector
421 >   * @param v1 the source vector
422 >   * @param s the scalar value
423 >   */
424 >  template<typename Real, unsigned int Dim>    
425 >  Vector<Real, Dim> operator / ( const Vector<Real, Dim>& v1, Real s) {      
426 >    Vector<Real, Dim> result;
427 >    result.div( v1,s);
428 >    return result;          
429 >  }
430 >    
431 >  /**
432 >   * Returns the dot product of two Vectors
433 >   * @param v1 first vector
434 >   * @param v2 second vector
435 >   * @return the dot product of v1 and v2
436 >   */
437 >  template<typename Real, unsigned int Dim>    
438 >  inline Real dot( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
439 >    Real tmp;
440 >    tmp = 0;
441 >
442 >    for (unsigned int i = 0; i < Dim; i++)
443 >      tmp += v1[i] * v2[i];
444 >
445 >    return tmp;
446 >  }
447 >
448 >  /**
449 >   * Returns the distance between  two Vectors
450 >   * @param v1 first vector
451 >   * @param v2 second vector
452 >   * @return the distance between v1 and v2
453 >   */  
454 >  template<typename Real, unsigned int Dim>    
455 >  inline Real distance( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
456 >    Vector<Real, Dim> tempVector = v1 - v2;
457 >    return tempVector.length();
458 >  }
459 >
460 >  /**
461 >   * Returns the squared distance between  two Vectors
462 >   * @param v1 first vector
463 >   * @param v2 second vector
464 >   * @return the squared distance between v1 and v2
465 >   */
466 >  template<typename Real, unsigned int Dim>
467 >  inline Real distanceSquare( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
468 >    Vector<Real, Dim> tempVector = v1 - v2;
469 >    return tempVector.lengthSquare();
470 >  }
471 >
472 >  /**
473 >   * Write to an output stream
474 >   */
475 >  template<typename Real, unsigned int Dim>
476 >  std::ostream &operator<< ( std::ostream& o, const Vector<Real, Dim>& v) {
477 >
478 >    o << "[ ";
479 >        
480 >    for (unsigned int i = 0 ; i< Dim; i++) {
481 >      o << v[i];
482 >
483 >      if (i  != Dim -1) {
484 >        o<< ", ";
485 >      }
486      }
487 +
488 +    o << " ]";
489 +    return o;        
490 +  }
491      
492   }
493   #endif

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines