00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 template<typename T, int W, int H>
00026 Mat<T, W, H>& Mat<T, W, H>::operator=(typename Mat<T, W, H>::ConstValType& scalar)
00027 {
00028 return matrix::assign(*this, scalar);
00029 }
00030
00031 template<typename T, int W, int H> inline
00032 Mat<T, W, H>& Mat<T, W, H>::operator=(typename Mat<T, W, H>::ConstValTypePtr valptr)
00033 {
00034 return matrix::assign(*this, valptr);
00035 }
00036
00037 template<typename T, int W, int H> inline
00038 Mat<T, W, H>& Mat<T, W, H>::operator=(typename Mat<T, W, H>::ConstMatType& mat)
00039 {
00040 return matrix::assign(*this, mat);
00041 }
00042
00043
00044
00045
00046 template<typename T, int W, int H> inline
00047 Mat<T, W, H> Mat<T, W, H>::operator+(typename Mat<T, W, H>::ConstMatType& mat) const
00048 {
00049 Mat<T, W, H> m;
00050 for (int i= 0; i < W; i++ )
00051 m.val[i]= val[i] + mat.val[i];
00052
00053 return m;
00054 };
00055
00056 template<typename T, int W, int H> inline
00057 Mat<T, W, H>& Mat<T, W, H>::operator+=(typename Mat<T, W, H>::ConstMatType& mat)
00058 {
00059 for (int i= 0; i < W; i++ )
00060 val[i]+= mat.val[i];
00061 return *this;
00062 };
00063
00064 template<typename T, int W, int H> inline
00065 Mat<T, W, H> Mat<T, W, H>::operator-(typename Mat<T, W, H>::ConstMatType& mat) const
00066 {
00067 Mat<T, W, H> m;
00068 for (int i= 0; i < W; i++ )
00069 m.val[i]= val[i] - mat.val[i];
00070 return m;
00071 };
00072
00073 template<typename T, int W, int H> inline
00074 Mat<T, W, H>& Mat<T, W, H>::operator-=(typename Mat<T, W, H>::ConstMatType& mat)
00075 {
00076 for (int i= 0; i < W; i++ )
00077 val[i]-= mat.val[i];
00078 return *this;
00079 };
00080
00081 template<typename T, int W, int H> inline
00082 Mat<T, W, H> Mat<T, W, H>::operator*(typename Mat<T, W, H>::ConstValType& scalar) const
00083 {
00084 Mat<T, W, H> m;
00085 for (int i= 0; i < W; i++ )
00086 m.val[i]= val[i] * scalar;
00087 return m;
00088 };
00089
00090 template<typename T, int W, int H> inline
00091 Mat<T, W, H>& Mat<T, W, H>::operator*=(typename Mat<T, W, H>::ConstValType& scalar)
00092 {
00093 for (int i= 0; i < W; i++)
00094 val[i]*= scalar;
00095 return *this;
00096 };
00097
00098 template<typename T, int W, int H> inline
00099 Mat<T, W, H> Mat<T, W, H>::operator/(typename Mat<T, W, H>::ConstValType& scalar) const
00100 {
00101 Mat<T, W, H> m;
00102 for (int i= 0; i < W; i++ )
00103 m.val[i]/= scalar;
00104 return m;
00105 };
00106
00107 template<typename T, int W, int H> inline
00108 Mat<T, W, H>& Mat<T, W, H>::operator/=(typename Mat<T, W, H>::ConstValType& scalar)
00109 {
00110 for (int i= 0; i < W; i++)
00111 val[i]*= scalar;
00112 return *this;
00113 };
00114
00115
00116
00117 template<typename T, int W, int H>
00118 template<int WW> inline
00119 Mat<T, WW, H> Mat<T, W, H>::operator*(const Mat<T, WW, W>& mat) const
00120 {
00121 Mat<T, WW, H> m;
00122 int col;
00123 int row;
00124 int i;
00125
00126 for(col= 0; col < WW; col++ )
00127 {
00128 for(row= 0; row < W; row++ )
00129 {
00130 m(col, row)= Mat<T, WW, H>::ValTrait::zero();
00131 for(i= 0; i < W; i++ )
00132 {
00133 m(col, row)+= (*this)(i, row) * mat(col, i);
00134 }
00135 }
00136 }
00137
00138 return m;
00139 };
00140
00141 template<typename T, int W, int H> inline
00142 Vec<T, W> Mat<T, W, H>::operator*(const Vec<T, W>& vec) const
00143 {
00144 Vec<T, W> v;
00145 int row;
00146 int i;
00147
00148 for(row= 0; row < W; row++ )
00149 {
00150 v[row]= Vec<T, W>::ValTrait::zero();
00151 for(i= 0; i < W; i++ )
00152 {
00153 v[row]+= (*this)(i, row) * vec[i];
00154 }
00155 }
00156
00157 return v;
00158 };
00159
00160
00161 template<typename T, int W, int H> inline
00162 Mat<T, W, H>& Mat<T, W, H>::operator*=(const Mat<T, H, W>& mat)
00163 {
00164 Mat<T, W, H> m;
00165
00166 m= (*this) * mat;
00167 (*this)= m;
00168
00169 return (*this);
00170 };
00171
00172
00173
00174
00175
00176
00177
00178 template<typename T, int W, int H> inline
00179 Mat<T, W, H>& matrix::assign(Mat<T, W, H>& m, const T& scalar)
00180 {
00181 for (T* i= m.begin(); i != m.end(); )
00182 *i++= scalar;
00183 return m;
00184 }
00185
00186 template<typename T> inline
00187 Mat<T, 3, 3>& matrix::assign(Mat<T, 3, 3>& m, const T& scalar)
00188 {
00189 m.val[0]= m.val[1]= m.val[2]= scalar;
00190 return m;
00191 }
00192
00193 template<typename T, int W, int H> inline
00194 Mat<T, W, H>& matrix::assign(Mat<T, W, H>& m, const T* valptr)
00195 {
00196 for (T* i= m.begin(); i != m.end(); )
00197 *i++= *valptr++;
00198 return m;
00199 }
00200
00201 template<typename T, int W, int H> inline
00202 Mat<T, W, H>& matrix::assign(Mat<T, W, H>& m, const Mat<T, W, H>& mat)
00203 {
00204 const T* j= mat.begin();
00205 for (T* i= m.begin(); i != m.end(); )
00206 *i++= *j++;
00207 return m;
00208 }
00209
00210
00211
00212 template<typename T, int W, int H>
00213 std::ostream& operator<<(std::ostream& os, const Mat<T, W, H>& m)
00214 {
00215 os << "\n";
00216 int col;
00217 int row;
00218
00219 for (row= 0; row < H; row++ )
00220 {
00221 os << "|";
00222 for ( col= 0; col < W; col++ )
00223 {
00224 os << m(col, row) << " ";
00225 }
00226 os << "|\n";
00227 }
00228
00229 return os << "|";
00230 }
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243