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 1564 by tim, Wed Oct 13 22:24:59 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 <    /**
43 <     * @class Vector Vector.hpp "math/Vector.hpp"
44 <     * @brief Fix length vector class
45 <     */
46 <    template<typename Real, unsigned int Dim>
47 <    class Vector{
48 <        public:
58 >  static const double epsilon = 0.000001;
59  
60 <            /** default constructor */
61 <            inline Vector(){
62 <                for (unsigned int i = 0; i < Dim; i++)
63 <                    data_[i] = 0.0;
54 <            }
60 >  template<typename T>
61 >  inline bool equal(T e1, T e2) {
62 >    return e1 == e2;
63 >  }
64  
65 <            /** Constructs and initializes a Vector from a vector */
66 <            inline Vector(const Vector<Real, Dim>& v) {
67 <                *this  = v;
68 <            }
65 >  template<>
66 >  inline bool equal(float e1, float e2) {
67 >    return fabs(e1 - e2) < epsilon;
68 >  }
69  
70 <            /** copy assignment operator */
71 <            inline Vector<Real, Dim>& operator=(const Vector<Real, Dim>& v) {
72 <                if (this == &v)
73 <                    return *this;
65 <                
66 <                for (unsigned int i = 0; i < Dim; i++)            
67 <                    data_[i] = v[i];
68 <                
69 <                return *this;
70 <            }
71 <            
72 <            /** Constructs and initializes a Vector from an array */            
73 <            inline Vector( double* v) {
74 <                for (unsigned int i = 0; i < Dim; i++)
75 <                    data_[i] = v[i];
76 <            }
70 >  template<>
71 >  inline bool equal(double e1, double e2) {
72 >    return fabs(e1 - e2) < epsilon;
73 >  }
74  
75 <            /**
76 <             * Returns reference of ith element.
77 <             * @return reference of ith element
78 <             * @param i index
79 <             */
80 <            inline double& operator[](unsigned int  i) {
81 <                assert( i < Dim);
82 <                return data_[i];
86 <            }
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:
83  
84 <            /**
85 <             * Returns reference of ith element.
90 <             * @return reference of ith element
91 <             * @param i index
92 <             */
93 <            inline double& operator()(unsigned int  i) {
94 <                assert( i < Dim);
95 <                return data_[i];
96 <            }
84 >    typedef Real ElemType;
85 >    typedef Real* ElemPoinerType;
86  
87 <            /**
88 <             * Returns constant reference of ith element.
89 <             * @return reference of ith element
90 <             * @param i index
91 <             */
103 <            inline  const double& operator[](unsigned int i) const {
104 <                assert( i < Dim);
105 <                return data_[i];
106 <            }
87 >    /** default constructor */
88 >    inline Vector(){
89 >      for (unsigned int i = 0; i < Dim; i++)
90 >        this->data_[i] = 0;
91 >    }
92  
93 <            /**
94 <             * Returns constant reference of ith element.
95 <             * @return reference of ith element
96 <             * @param i index
112 <             */
113 <            inline  const double& operator()(unsigned int i) const {
114 <                assert( i < Dim);
115 <                return data_[i];
116 <            }
93 >    /** Constructs and initializes a Vector from a vector */
94 >    inline Vector(const Vector<Real, Dim>& v) {
95 >      *this  = v;
96 >    }
97  
98 <            /** Negates the value of this vector in place. */          
99 <            inline void negate() {
100 <                data_[0] = -data_[0];
101 <                data_[1] = -data_[1];
102 <                data_[2] = -data_[2];
103 <            }
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 >        this->data_[i] = v[i];
105 >                
106 >      return *this;
107 >    }
108  
109 <            /**
110 <            * Sets the value of this vector to the negation of vector v1.
111 <            * @param v1 the source vector
112 <            */
113 <            inline void negate(const Vector<Real, Dim>& v1) {
130 <                for (unsigned int i = 0; i < Dim; i++)
131 <                    data_[i] = -v1.data_[i];
132 <
133 <            }
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 <            /**
116 <            * Sets the value of this vector to the sum of itself and v1 (*this += v1).
117 <            * @param v1 the other vector
118 <            */
119 <            inline void add( const Vector<Real, Dim>& v1 ) {
140 <                for (unsigned int i = 0; i < Dim; i++)
141 <                    data_[i] += v1.data_[i];
142 <                }
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 <            * Sets the value of this vector to the sum of v1 and v2 (*this = v1 + v2).
123 <            * @param v1 the first vector
124 <            * @param v2 the second vector
125 <            */
126 <            inline void add( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
127 <                for (unsigned int i = 0; i < Dim; i++)
128 <                    data_[i] = v1.data_[i] + v2.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 <            * Sets the value of this vector to the difference  of itself and v1 (*this -= v1).
133 <            * @param v1 the other vector
134 <            */
135 <            inline void sub( const Vector<Real, Dim>& v1 ) {
136 <                for (unsigned int i = 0; i < Dim; i++)
137 <                    data_[i] -= v1.data_[i];
138 <            }
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 <            * Sets the value of this vector to the difference of vector v1 and v2 (*this = v1 - v2).
143 <            * @param v1 the first vector
144 <            * @param v2 the second vector
145 <            */
146 <            inline void sub( const Vector<Real, Dim>& v1, const Vector  &v2 ){
147 <                for (unsigned int i = 0; i < Dim; i++)
148 <                    data_[i] = v1.data_[i] - v2.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 <            * Sets the value of this vector to the scalar multiplication of itself (*this *= s).
153 <            * @param s the scalar value
154 <            */
155 <            inline void mul( double s ) {
156 <                for (unsigned int i = 0; i < Dim; i++)
157 <                   data_[i] *= s;
158 <            }
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 <            * Sets the value of this vector to the scalar multiplication of vector v1  
163 <            * (*this = s * v1).
164 <            * @param s the scalar value
165 <            * @param v1 the vector
166 <            */
188 <            inline void mul( double s, const Vector<Real, Dim>& v1 ) {
189 <                for (unsigned int i = 0; i < Dim; i++)
190 <                    data_[i] = s * v1.data_[i];
191 <            }
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 <            /**
169 <            * Sets the value of this vector to the scalar division of itself  (*this /= s ).
170 <            * @param s the scalar value
171 <            */            
172 <            inline void div( double s) {
173 <                for (unsigned int i = 0; i < Dim; i++)            
174 <                    data_[i] /= s;
175 <            }
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 <            /**
181 <            * Sets the value of this vector to the scalar division of vector v1  (*this = v1 / s ).
182 <            * @param v1 the source vector
183 <            * @param s the scalar value
184 <            */                        
185 <            inline void div( const Vector<Real, Dim>& v1, double s ) {
186 <                for (unsigned int i = 0; i < Dim; i++)
187 <                    data_[i] = v1.data_[i] / s;
210 <            }
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 >    }
188  
189 <            /** @see #add */
190 <            inline Vector<Real, Dim>& operator +=( const Vector<Real, Dim>& v1 ) {
191 <                add(v1);
192 <                return *this;
193 <            }
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 >      for (unsigned int i = 0; i < Dim; i++)
201 >        this->data_[i] = -this->data_[i];
202 >    }
203  
204 <            /** @see #sub */
205 <            inline Vector<Real, Dim>& operator -=( const Vector<Real, Dim>& v1 ) {
206 <                sub(v1);
207 <                return *this;
208 <            }
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 <            /** @see #mul */
225 <            inline Vector<Real, Dim>& operator *=( double s) {
226 <                mul(s);
227 <                return *this;
228 <            }
229 <
230 <            /** @see #div */
231 <            inline Vector<Real, Dim>& operator /=( double s ) {
232 <                div(s);
233 <                return *this;
234 <            }
235 <
236 <            /**
237 <             * Returns the length of this vector.
238 <             * @return the length of this vector
239 <             */
240 <             inline double length() {
241 <                return sqrt(lengthSquared());  
242 <            }
212 >    }
213              
214 <            /**
215 <             * Returns the squared length of this vector.
216 <             * @return the squared length of this vector
217 <             */
218 <             inline double lengthSquared() {
219 <                return dot(*this, *this);
220 <            }
251 <            
252 <            /** Normalizes this vector in place */
253 <            inline void normalize() {
254 <                double len;
255 <
256 <                len = length();
257 <                *this /= len;
258 <            }
259 <            
260 <        protected:
261 <            double data_[3];
262 <        
263 <    };
264 <
265 <    /** unary minus*/
266 <    template<typename Real, unsigned int Dim>    
267 <    inline Vector<Real, Dim> operator -(const Vector<Real, Dim>& v1){
268 <        Vector tmp(v1);
269 <        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).
274 <     * @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;
281 <        
282 <        result.add(v1, v2);
283 <        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;
295 <        result.sub(v1, v2);
296 <        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).
301 <     * @return  the vaule of scalar multiplication of this vector
302 <     * @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;
308 <        result.mul(s, v1);
309 <        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 ) {
320 <        Vector<Real, Dim> result;
321 <        result.mul(s, v1);
322 <        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.
327 <     * @return  the vaule of scalar division of this vector
328 <     * @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;
334 <        result.div( v1,s);
335 <        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.
340 <     * @return  the vaule of scalar division of this vector
341 <     * @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);
348 <        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
362 <     * @return the dot product of v1 and v2
363 <     */
364 <    template<typename Real, unsigned int Dim>    
365 <    inline Real dot( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
366 <                Real tmp;
367 <                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 <     */
381 <    template<typename Real, unsigned int Dim>    
382 <    inline Real distance( const Vector<Real, Dim>& v1, const Vector<Real, Dim>& v2 ) {
383 <        Vector<Real, Dim> tempVector = v1 - v2;
384 <        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
390 <     * @param v2 second vector
391 <     * @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 ) {
395 <        Vector<Real, Dim> tempVector = v1 - v2;
396 <        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>& v1 ) {
347 >    inline bool isNormalized() {
348 >      return equal(lengthSquare(), 1.0);
349 >    }          
350 >
351 >    unsigned int size() {return Dim;}
352 >  protected:
353 >    Real data_[Dim];
354          
355 <        return o;        
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