00001
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
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
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
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
00169 template<typename T, int N>
00170 VVector<T,N>& convert(const vuVector& source, VVector<T,N>& target)
00171 {
00172
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
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
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
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 }
00211
00212 #endif