Main Page | Class Hierarchy | Class List | File List | Class Members

VVectorFun.h

00001 // -*- C++ -*-
00002 #ifndef __VVECTORFUN_H__
00003 #define __VVECTORFUN_H__
00004 
00005 #include "VVector.h"
00006 #include <math.h>
00007 #include <functional>
00008 #include "vuVector.h"
00009 
00010 namespace math {
00011 using math::VVector;
00014 //----------------------------------------------------------------------------
00015 //operators
00016 
00018 template<typename T, int N>
00019 T dot(const VVector<T,N>& a, const VVector<T,N>& b) {
00020     T res(0);
00021     for(typename VVector<T,N>::value_cptr ai=a.begin(), bi=b.begin(); 
00022         ai!=a.end(); ai++, bi++)
00023         res+=(*ai)*(*bi);
00024     return res;
00025 }
00026 
00028 template<typename T>
00029 VVector<T,3> cross(const VVector<T,3>& a, const VVector<T,3>& b) 
00030 {
00031     VVector<T,3> p;
00032     p[0] = a.val[1]*b.val[2] - a.val[2]*b.val[1];
00033     p[1] = a.val[2]*b.val[0] - a.val[0]*b.val[2];
00034     p[2] = a.val[0]*b.val[1] - a.val[1]*b.val[0];
00035     return p;
00036 }
00037 
00038 // //! cross product
00039 // template<typename T>
00040 // VVector<T,4> cross(const VVector<T,4>& a, const VVector<T,4>& b) 
00041 // {
00042 //     VVector<T,4> v;
00043 //     v[0] = r[1]*s[2]*t[3] + r[2]*s[3]*t[1] + r[3]*s[1]*t[2] 
00044 //          - r[1]*s[3]*t[2] - r[2]*s[1]*t[3] - r[3]*s[2]*t[1];
00045 //     v[1] = r[0]*s[3]*t[2] + r[2]*s[0]*t[3] + r[3]*s[2]*t[0] 
00046 //          - r[0]*s[2]*t[3] - r[2]*s[3]*t[0] - r[3]*s[0]*t[2];
00047 //     v[2] = r[0]*s[1]*t[3] + r[1]*s[3]*t[0] + r[3]*s[0]*t[1] 
00048 //          - r[0]*s[3]*t[1] - r[1]*s[0]*t[3] - r[3]*s[1]*t[0];
00049 //     v[3] = r[0]*s[2]*t[1] + r[1]*s[0]*t[2] + r[2]*s[1]*t[0] 
00050 //          - r[0]*s[1]*t[2] - r[1]*s[2]*t[0] - r[2]*s[0]*t[1];
00051 //     return v;
00052 // }
00053 
00055 template<typename T, int N>
00056 T norm2(const VVector<T,N>& a) {
00057     T res(0);
00058     for(typename VVector<T,N>::value_cptr ai=a.begin(); ai!=a.end(); ai++)
00059         res+=(*ai)*(*ai);
00060     return res;
00061 }
00062 
00064 template<typename T, int N>
00065 double norm(const VVector<T,N>& a) {
00066     return sqrt(double(norm2(a)));
00067 }
00068 
00071 template<typename T, int N>
00072 T normalize(VVector<T,N>& a) {
00073     T length = norm(a);
00074     if ( length ) a *= T(1)/length;
00075     return length;
00076 }
00077 
00079 template<typename T, int N> T product(const VVector<T,N>& v) {
00080     T res = v[0];
00081     for(const T* e=v.begin()+1; e!=v.end(); e++) res *= *e;
00082     return res;
00083 }
00084 
00086 template<typename T, int N> T sum(const VVector<T,N>& v) {
00087     T res = v[0];
00088     for(const T* e=v.begin()+1; e!=v.end(); e++) res += *e;
00089     return res;
00090 }
00091 
00093 template<typename T, int N> T max(const VVector<T,N>& v) {
00094     T res = v[0];
00095     for(const T* e=v.begin()+1; e!=v.end(); e++)
00096         if(res<*e) res = *e;
00097     return res;
00098 }
00099 
00101 template<typename T, int N> T min(const VVector<T,N>& v) {
00102     T res = v[0];
00103     for(const T* e=v.begin()+1; e!=v.end(); e++)
00104         if(res>*e) res = *e;
00105     return res;
00106 }
00108 template<typename T, int N>
00109 VVector<T,N>& maxVector(const VVector<T,N>& a, const VVector<T,N>& b, 
00110                         VVector<T,N>& target) 
00111 {
00112     T* ti=target.begin();
00113     for(const T *ai=a.begin(), *bi=b.begin(); 
00114         ai!=a.end(); ai++, bi++, ti++)
00115         *ti = std::max(*ai,*bi);
00116     return target;
00117 }
00119 template<typename T, int N>
00120 VVector<T,N> maxVector(const VVector<T,N>& a, const VVector<T,N>& b) 
00121 {
00122     VVector<T,N> target; return maxVector(a,b,target);
00123 }
00125 template<typename T, int N>
00126 VVector<T,N>& minVector(const VVector<T,N>& a, const VVector<T,N>& b, 
00127                         VVector<T,N>& target) 
00128 {
00129     T* ti=target.begin();
00130     for(const T *ai=a.begin(), *bi=b.begin(); 
00131         ai!=a.end(); ai++, bi++, ti++)
00132         *ti = std::min(*ai,*bi);
00133     return target;
00134 }
00136 template<typename T, int N>
00137 VVector<T,N> minVector(const VVector<T,N>& a, const VVector<T,N>& b) 
00138 {
00139     VVector<T,N> target; return minVector(a,b,target);
00140 }
00142 template<int N>
00143 VVector<float,N>& floor(const VVector<float,N>& a, VVector<float,N>& target) 
00144 {
00145     std::transform(a.begin(), a.end(), target.begin(), std::ptr_fun(::floorf));
00146 }
00148 template<int N>
00149 VVector<double,N>& floor(const VVector<double,N>& a, VVector<double,N>& target) 
00150 {
00151     std::transform(a.begin(), a.end(), target.begin(), std::ptr_fun(::floor));
00152 }
00154 template<typename T, int N>
00155 VVector<T,N> floor(const VVector<T,N>& a) 
00156 {
00157     VVector<T,N> target; return floor(a,target);
00158 }
00159 
00161 template<typename T, int N, typename T2, int N2>
00162 VVector<T,N>& convert(const VVector<T2,N2>& source, VVector<T,N>& target)
00163 { 
00164     STATIC_CHECK(N2<=N,Size_of_source_vector_has_to_be_less_or_equal);
00165     std::copy(source.begin(), source.end(), target.begin()); return target; 
00166 }
00167 //keep these just as long as vuVector is not based on VVector
00169 template<typename T, int N>
00170 VVector<T,N>& convert(const vuVector& source, VVector<T,N>& target)
00171 { 
00172     //STATIC_CHECK(4<=N,Size_of_source_vector_has_to_be_less_or_equal_4);
00173     std::transform(source.getData(), source.getData()+std::min(N,4),
00174                    target.begin(), Convert<float,T>()); return target; 
00175 }
00177 template<typename T, int N>
00178 vuVector& convert(const VVector<T,N>& source, vuVector& target)
00179 { 
00180     STATIC_CHECK(N<=4,Size_of_source_vector_has_to_be_bigger_or_equal_4);
00181     std::copy(source.begin(), source.end(),
00182               target.getData()); return target; 
00183 }
00184 
00185 template<typename T>
00186 VVector<T,2> makeVec(const T& a, const T& b) {
00187     //STATIC_CHECK(N==2, Constructor_only_available_if_N_is_2 );
00188     VVector<T,2> v;
00189     v.data[0] = a; v.data[1] = b;
00190     return v;
00191 }
00193 template<typename T>
00194 VVector<T,3> makeVec(const T& a, const T& b, const T& c) {
00195     //STATIC_CHECK(N==3, Constructor_only_available_if_N_is_3 );
00196     VVector<T,3> v;
00197     v.data[0] = a; v.data[1] = b; v.data[2] = c;
00198     return v;
00199 }
00201 template<typename T>    
00202 VVector<T,4> makeVec(const T& a, const T& b, const T& c, const T& d) {
00203     //STATIC_CHECK(N==4, Constructor_only_available_if_N_is_4 );
00204     VVector<T,4> v;
00205     v.data[0] = a; v.data[1] = b; v.data[2] = c; v.data[3] = d;
00206     return v;
00207 }
00208 
00209 
00210 } // end of namespace math
00211 
00212 #endif

Generated on Thu Apr 13 04:55:56 2006 by  doxygen 1.4.4