From 3d96965ecd28b9037a83c4b22f65fcf502dce336 Mon Sep 17 00:00:00 2001 From: Yann Herklotz Date: Sat, 29 Jul 2017 10:00:20 +0100 Subject: Updating docs --- matrix_8hpp_source.html | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'matrix_8hpp_source.html') diff --git a/matrix_8hpp_source.html b/matrix_8hpp_source.html index ea7481a9..c7e90006 100644 --- a/matrix_8hpp_source.html +++ b/matrix_8hpp_source.html @@ -22,6 +22,7 @@
YAGE +  0.02
Yet Another Game Engine
@@ -67,16 +68,20 @@ $(function() {
matrix.hpp
-Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2  * matrix.hpp
3  *
4  * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com> -- MIT License
5  * See file LICENSE for more details
6  * ----------------------------------------------------------------------------
7  */
8 
20 #ifndef YAGE_MATH_MATRIX_HPP
21 #define YAGE_MATH_MATRIX_HPP
22 
23 #include <algorithm>
24 #include <exception>
25 #include <iostream>
26 #include <sstream>
27 #include <string>
28 #include <vector>
29 
30 namespace yage
31 {
32 
33 template<int Rows, int Cols, class Type> class Matrix;
34 
43 namespace detail
44 {
45 
46 template<int Rows, int Cols, class Type> class Row
47 {
48 private:
49  Matrix<Rows, Cols, Type> *parent_;
50  int index_;
51 
52 public:
54  parent_(parent), index_(index)
55  {}
56 
57  Type& operator[](int col)
58  {
59  // the index is the y-position of the element in the matrix
60  return parent_->data_[index_*Cols+col];
61  }
62 
63  const Type& operator[](int col) const
64  {
65  return parent_->data_[index_*Cols+col];
66  }
67 };
68 
69 } // detail
70 
80 template<int Rows=4, int Cols=4, class Type=double> class Matrix
81 {
82  // friended with the row class so that it can access protected member data
83  friend class detail::Row<Rows, Cols, Type>;
84 protected:
85  std::vector<Type> data_;
86 
87 public:
88  Matrix<Rows, Cols, Type>() : data_(Rows*Cols) {}
89 
90  int rowSize() const
91  {
92  return Rows;
93  }
94 
95  int colSize() const
96  {
97  return Cols;
98  }
99 
100  // returns the row in a row matrix
101  Matrix<1, Cols, Type> getRow(int row) const
102  {
103  Matrix<1, Cols, Type> rowMatrix;
104  for(int i=0; i<Cols; ++i)
105  {
106  rowMatrix[0][i]=data_[row][i];
107  }
108  return rowMatrix;
109  }
110 
111  // returns the column in a column matrix
112  Matrix<Rows, 1, Type> getCol(int col) const
113  {
114  Matrix<Rows, 1, Type> colMatrix;
115  for(int i=0; i<Rows; ++i)
116  {
117  colMatrix[i][0]=data_[i][col];
118  }
119  return colMatrix;
120  }
121 
122  // iterator support for begin
123  typename std::vector<Type>::iterator begin()
124  {
125  return data_.begin();
126  }
127 
128  // iterator support for end
129  typename std::vector<Type>::iterator end()
130  {
131  return data_.end();
132  }
133 
134  // prints out the matrix, but can also be implemented by other classes to print data
135  // differently
136  virtual std::string toString() const
137  {
138  std::stringstream ss;
139  ss<<'[';
140  for(int i=0; i<Rows-1; ++i)
141  {
142  ss<<'[';
143  for(int j=0; j<Cols-1; ++j)
144  {
145  ss<<data_[i*Cols+j]<<' ';
146  }
147  ss<<data_[(Rows-1)*Cols+Cols-1]<<"],";
148  }
149  ss<<'[';
150  for(int j=0; j<Cols-1; ++j)
151  {
152  ss<<data_[(Rows-1)*Cols+j]<<' ';
153  }
154  ss<<data_[(Rows-1)*Cols+Cols-1]<<"]]";
155  return ss.str();
156  }
157 
158  detail::Row<Rows, Cols, Type> operator[](int row)
159  {
160  return detail::Row<Rows, Cols, Type>(this, row);
161  }
162 
163  detail::Row<Rows, Cols, Type> operator[](int row) const
164  {
165  // TODO got to fix this
167  }
168 
169  Matrix<Rows, Cols, Type>& operator=(const Matrix<Rows, Cols, Type> &other)
170  {
171  if(this!=&other)
172  {
173  data_=other.data_;
174  }
175  return *this;
176  }
177 
178  Matrix<Rows, Cols, Type>& operator+=(const Matrix<Rows, Cols, Type> &rhs)
179  {
180  std::vector<Type> out;
181  out.reserve(data_.size());
182  std::transform(data_.begin(), data_.end(), rhs.data_.begin(), std::back_inserter(out),
183  [] (Type a, Type b) {
184  return a+b;
185  });
186  data_=std::move(out);
187  return *this;
188  }
189 
190  Matrix<Rows, Cols, Type>& operator-=(const Matrix<Rows, Cols, Type> &rhs)
191  {
192  std::vector<Type> out;
193  out.reserve(data_.size());
194  std::transform(data_.begin(), data_.end(), rhs.begin(), std::back_inserter(out),
195  [] (Type a, Type b) {
196  return a-b;
197  });
198  data_=std::move(out);
199  return *this;
200  }
201 };
202 
203 template<int M, int N, class T>
204 Matrix<M, N, T> operator+(Matrix<M, N, T> lhs, const Matrix<M, N, T> &rhs)
205 {
206  lhs+=rhs;
207  return lhs;
208 }
209 
210 template<int M, int N, class T>
211 Matrix<M, N, T> operator-(Matrix<M, N, T> lhs, const Matrix<M, N, T> &rhs)
212 {
213  lhs-=rhs;
214  return lhs;
215 }
216 
217 template<int M, int N, class T>
218 Matrix<M, N, T> operator+(Matrix<M, N, T> lhs, const T &rhs)
219 {
220  for(auto &data : lhs)
221  {
222  data+=rhs;
223  }
224  return lhs;
225 }
226 
227 template<int M, int N, class T>
228 Matrix<M, N, T> operator+(const T &lhs, Matrix<M, N, T> rhs)
229 {
230  for(auto &data : rhs)
231  {
232  data+=lhs;
233  }
234  return rhs;
235 }
236 
237 template<int M, int N, class T>
238 Matrix<M, N, T> operator-(Matrix<M, N, T> lhs, const T &rhs)
239 {
240  for(auto &data : lhs)
241  {
242  data-=rhs;
243  }
244  return lhs;
245 }
246 
247 template<int M, int N, class T>
248 Matrix<M, N, T> operator-(const T &lhs, Matrix<M, N, T> rhs)
249 {
250  for(auto &data : rhs)
251  {
252  data=lhs-data;
253  }
254  return rhs;
255 }
256 
257 template<int M, int N, class T>
258 Matrix<M, N, T> operator*(Matrix<M, N, T> lhs, const T &rhs)
259 {
260  for(auto &data : lhs)
261  {
262  data*=rhs;
263  }
264  return lhs;
265 }
266 
267 template<int M, int N, class T>
268 Matrix<M, N, T> operator*(const T &lhs, Matrix<M, N, T> rhs)
269 {
270  for(auto &data : rhs)
271  {
272  data*=lhs;
273  }
274  return rhs;
275 }
276 
277 template<int M, int N, class T>
278 Matrix<M, N, T> operator/(Matrix<M, N, T> lhs, const T &rhs)
279 {
280  for(auto &data : lhs)
281  {
282  data/=rhs;
283  }
284  return lhs;
285 }
286 
287 template<int M, int N, class T>
288 bool operator==(const Matrix<M, N, T> &lhs, const Matrix<M, N, T> &rhs)
289 {
290  for(int i=0; i<M; ++i)
291  for(int j=0; j<N; ++j)
292  if(lhs[i][j]!=rhs[i][j])
293  return false;
294  return true;
295 }
296 
297 template<int M, int N, class T>
298 std::ostream& operator<<(std::ostream &os, const Matrix<M, N, T> &mat)
299 {
300  return os<<mat.toString();
301 }
302 
303 template<int Rows=2, class Type=double> class Vector : public Matrix<Rows, 1, Type>
304 {
305 public:
307  explicit Vector<Rows, Type>(const Matrix<Rows, 1, Type> &other) : Matrix<Rows, 1, Type>(other) {}
308 
309  Type& operator[](int col)
310  {
311  return this->data_[col];
312  }
313 
314  const Type& operator[](int col) const
315  {
316  return this->data_[col];
317  }
318 
319  virtual std::string toString() const
320  {
321  std::stringstream ss;
322  ss<<"[";
323  for(std::size_t i=0; i<this->data_.size()-1; ++i)
324  {
325  ss<<this->data_[i]<<" ";
326  }
327  ss<<this->data_[this->data_.size()-1]<<"]";
328  return ss.str();
329  }
330 };
331 
332 template<class Type=double> class Vector2 : public Vector<2, Type>
333 {
334 public:
336 
337  Vector2<Type>(Type x, Type y)
338  {
339  this->data_[0]=x;
340  this->data_[1]=y;
341  }
342 
343  Vector2<Type>(const Matrix<2, 1, Type> &other) : Vector<2, Type>(other) {}
344 
345  Type& x()
346  {
347  return this->data_[0];
348  }
349 
350  const Type& x() const
351  {
352  return this->data_[0];
353  }
354 
355  Type& y()
356  {
357  return this->data_[1];
358  }
359 
360  const Type& y() const
361  {
362  return this->data_[1];
363  }
364 };
365 
366 typedef Vector2<double> Vector2d;
367 
368 namespace matrix
369 {
370 
371 template<int M, int N, class T> Matrix<N, M, T> transpose(const Matrix<M, N, T> &m)
372 {
373  Matrix<N, M, T> trans;
374  for(int i=0; i<M; ++i)
375  {
376  for(int j=0; j<N; ++j)
377  {
378  trans[j][i]=m[i][j];
379  }
380  }
381  return trans;
382 }
383 
384 template<int R, class T> T dot(const Matrix<R, 1, T> &m1, const Matrix<R, 1, T> &m2)
385 {
386  T sum=0;
387  for(int i=0; i<R; ++i)
388  {
389  sum += m1[i][0]*m2[i][0];
390  }
391  return sum;
392 }
393 
394 template<int M, int N, int P, int Q, class T>
395 Matrix<M, Q, T> multiply(const Matrix<M, N, T> &m1, const Matrix<P, Q, T> &m2)
396 {
397  if(N!=P)
398  {
399  throw std::runtime_error("Matrices don't have the right dimensions for multiplication");
400  }
401 
402  Matrix<M, Q, T> res;
403 
404  for(int i=0; i<M; ++i)
405  {
406  for(int j=0; j<Q; ++j)
407  {
408  res[i][j] = dot(transpose(m1.getRow(i)), m2.getCol(j));
409  }
410  }
411 
412  return res;
413 }
414 
415 } // matrix
416 
417 } // yage
418 
419 #endif
Definition: matrix.hpp:332
-
Detail namespace.
Definition: matrix.hpp:33
-
Definition: matrix.hpp:46
-
Definition: matrix.hpp:303
-
Base matrix class.
Definition: matrix.hpp:33
+Go to the documentation of this file.
1 /* ----------------------------------------------------------------------------
2  * matrix.hpp
3  *
4  * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com> -- MIT License
5  * See file LICENSE for more details
6  * ----------------------------------------------------------------------------
7  */
8 
9 
21 #ifndef YAGE_MATH_MATRIX_HPP
22 #define YAGE_MATH_MATRIX_HPP
23 
24 #include <algorithm>
25 #include <exception>
26 #include <iostream>
27 #include <sstream>
28 #include <string>
29 #include <vector>
30 
31 
32 namespace yage
33 {
34 
35 template<int Rows, int Cols, class Type> class Matrix;
36 
44 namespace detail
45 {
46 
55 template<int Rows, int Cols, class Type> class Row
56 {
57 private:
58  Matrix<Rows, Cols, Type> *parent_;
59  int index_;
60 
61 public:
62  Row<Rows, Cols, Type>(Matrix<Rows, Cols, Type> *parent, int index) :
63  parent_(parent), index_(index)
64  {}
65 
66  Type& operator[](int col)
67  {
68  // the index is the y-position of the element in the matrix
69  return parent_->data_[index_*Cols+col];
70  }
71 
72  const Type& operator[](int col) const
73  {
74  return parent_->data_[index_*Cols+col];
75  }
76 };
77 
78 } // detail
79 
88 template<int Rows=4, int Cols=4, class Type=double> class Matrix
89 {
90  // friended with the row class so that it can access protected member data
91  friend class detail::Row<Rows, Cols, Type>;
92 protected:
94  std::vector<Type> data_;
95 
96 public:
98  Matrix<Rows, Cols, Type>() : data_(Rows*Cols) {}
99 
101  int rowSize() const
102  {
103  return Rows;
104  }
105 
107  int colSize() const
108  {
109  return Cols;
110  }
111 
119  {
120  Matrix<1, Cols, Type> rowMatrix;
121  for(int i=0; i<Cols; ++i)
122  {
123  rowMatrix[0][i]=data_[row][i];
124  }
125  return rowMatrix;
126  }
127 
128  // returns the column in a column matrix
129  Matrix<Rows, 1, Type> getCol(int col) const
130  {
131  Matrix<Rows, 1, Type> colMatrix;
132  for(int i=0; i<Rows; ++i)
133  {
134  colMatrix[i][0]=data_[i][col];
135  }
136  return colMatrix;
137  }
138 
139  // iterator support for begin
140  typename std::vector<Type>::iterator begin()
141  {
142  return data_.begin();
143  }
144 
145  // iterator support for end
146  typename std::vector<Type>::iterator end()
147  {
148  return data_.end();
149  }
150 
151  // prints out the matrix, but can also be implemented by other classes to print data
152  // differently
153  virtual std::string toString() const
154  {
155  std::stringstream ss;
156  ss<<'[';
157  for(int i=0; i<Rows-1; ++i)
158  {
159  ss<<'[';
160  for(int j=0; j<Cols-1; ++j)
161  {
162  ss<<data_[i*Cols+j]<<' ';
163  }
164  ss<<data_[(Rows-1)*Cols+Cols-1]<<"],";
165  }
166  ss<<'[';
167  for(int j=0; j<Cols-1; ++j)
168  {
169  ss<<data_[(Rows-1)*Cols+j]<<' ';
170  }
171  ss<<data_[(Rows-1)*Cols+Cols-1]<<"]]";
172  return ss.str();
173  }
174 
175  detail::Row<Rows, Cols, Type> operator[](int row)
176  {
177  return detail::Row<Rows, Cols, Type>(this, row);
178  }
179 
180  detail::Row<Rows, Cols, Type> operator[](int row) const
181  {
182  // TODO got to fix this
183  return detail::Row<Rows, Cols, Type>((Matrix<Rows, Cols, Type>*)this, row);
184  }
185 
186  Matrix<Rows, Cols, Type>& operator=(const Matrix<Rows, Cols, Type> &other)
187  {
188  if(this!=&other)
189  {
190  data_=other.data_;
191  }
192  return *this;
193  }
194 
195  Matrix<Rows, Cols, Type>& operator+=(const Matrix<Rows, Cols, Type> &rhs)
196  {
197  std::vector<Type> out;
198  out.reserve(data_.size());
199  std::transform(data_.begin(), data_.end(), rhs.data_.begin(), std::back_inserter(out),
200  [] (Type a, Type b) {
201  return a+b;
202  });
203  data_=std::move(out);
204  return *this;
205  }
206 
207  Matrix<Rows, Cols, Type>& operator-=(const Matrix<Rows, Cols, Type> &rhs)
208  {
209  std::vector<Type> out;
210  out.reserve(data_.size());
211  std::transform(data_.begin(), data_.end(), rhs.begin(), std::back_inserter(out),
212  [] (Type a, Type b) {
213  return a-b;
214  });
215  data_=std::move(out);
216  return *this;
217  }
218 };
219 
220 template<int M, int N, class T>
221 Matrix<M, N, T> operator+(Matrix<M, N, T> lhs, const Matrix<M, N, T> &rhs)
222 {
223  lhs+=rhs;
224  return lhs;
225 }
226 
227 template<int M, int N, class T>
228 Matrix<M, N, T> operator-(Matrix<M, N, T> lhs, const Matrix<M, N, T> &rhs)
229 {
230  lhs-=rhs;
231  return lhs;
232 }
233 
234 template<int M, int N, class T>
235 Matrix<M, N, T> operator+(Matrix<M, N, T> lhs, const T &rhs)
236 {
237  for(auto &data : lhs)
238  {
239  data+=rhs;
240  }
241  return lhs;
242 }
243 
244 template<int M, int N, class T>
245 Matrix<M, N, T> operator+(const T &lhs, Matrix<M, N, T> rhs)
246 {
247  for(auto &data : rhs)
248  {
249  data+=lhs;
250  }
251  return rhs;
252 }
253 
254 template<int M, int N, class T>
255 Matrix<M, N, T> operator-(Matrix<M, N, T> lhs, const T &rhs)
256 {
257  for(auto &data : lhs)
258  {
259  data-=rhs;
260  }
261  return lhs;
262 }
263 
264 template<int M, int N, class T>
265 Matrix<M, N, T> operator-(const T &lhs, Matrix<M, N, T> rhs)
266 {
267  for(auto &data : rhs)
268  {
269  data=lhs-data;
270  }
271  return rhs;
272 }
273 
274 template<int M, int N, class T>
275 Matrix<M, N, T> operator*(Matrix<M, N, T> lhs, const T &rhs)
276 {
277  for(auto &data : lhs)
278  {
279  data*=rhs;
280  }
281  return lhs;
282 }
283 
284 template<int M, int N, class T>
285 Matrix<M, N, T> operator*(const T &lhs, Matrix<M, N, T> rhs)
286 {
287  for(auto &data : rhs)
288  {
289  data*=lhs;
290  }
291  return rhs;
292 }
293 
294 template<int M, int N, class T>
295 Matrix<M, N, T> operator/(Matrix<M, N, T> lhs, const T &rhs)
296 {
297  for(auto &data : lhs)
298  {
299  data/=rhs;
300  }
301  return lhs;
302 }
303 
304 template<int M, int N, class T>
305 bool operator==(const Matrix<M, N, T> &lhs, const Matrix<M, N, T> &rhs)
306 {
307  for(int i=0; i<M; ++i)
308  for(int j=0; j<N; ++j)
309  if(lhs[i][j]!=rhs[i][j])
310  return false;
311  return true;
312 }
313 
314 template<int M, int N, class T>
315 std::ostream& operator<<(std::ostream &os, const Matrix<M, N, T> &mat)
316 {
317  return os<<mat.toString();
318 }
319 
320 template<int Rows=2, class Type=double> class Vector : public Matrix<Rows, 1, Type>
321 {
322 public:
323  Vector<Rows, Type>() : Matrix<Rows, 1, Type>() {}
324  explicit Vector<Rows, Type>(const Matrix<Rows, 1, Type> &other) : Matrix<Rows, 1, Type>(other) {}
325 
326  Type& operator[](int col)
327  {
328  return this->data_[col];
329  }
330 
331  const Type& operator[](int col) const
332  {
333  return this->data_[col];
334  }
335 
336  virtual std::string toString() const
337  {
338  std::stringstream ss;
339  ss<<"[";
340  for(std::size_t i=0; i<this->data_.size()-1; ++i)
341  {
342  ss<<this->data_[i]<<" ";
343  }
344  ss<<this->data_[this->data_.size()-1]<<"]";
345  return ss.str();
346  }
347 };
348 
353 template<class Type=double> class Vector2 : public Vector<2, Type>
354 {
355 public:
356  Vector2<Type>() : Vector<2, Type>() {}
357 
358  Vector2<Type>(Type x, Type y)
359  {
360  this->data_[0]=x;
361  this->data_[1]=y;
362  }
363 
364  Vector2<Type>(const Matrix<2, 1, Type> &other) : Vector<2, Type>(other) {}
365 
366  Type& x()
367  {
368  return this->data_[0];
369  }
370 
371  const Type& x() const
372  {
373  return this->data_[0];
374  }
375 
376  Type& y()
377  {
378  return this->data_[1];
379  }
380 
381  const Type& y() const
382  {
383  return this->data_[1];
384  }
385 };
386 
389 
391 namespace matrix
392 {
393 
398 template<int M, int N, class T> Matrix<N, M, T> transpose(const Matrix<M, N, T> &m)
399 {
400  Matrix<N, M, T> trans;
401  for(int i=0; i<M; ++i)
402  {
403  for(int j=0; j<N; ++j)
404  {
405  trans[j][i]=m[i][j];
406  }
407  }
408  return trans;
409 }
410 
415 template<int R, class T> T dot(const Matrix<R, 1, T> &m1, const Matrix<R, 1, T> &m2)
416 {
417  T sum=0;
418  for(int i=0; i<R; ++i)
419  {
420  sum += m1[i][0]*m2[i][0];
421  }
422  return sum;
423 }
424 
431 template<int M, int N, int P, int Q, class T>
433 {
434  if(N!=P)
435  {
436  throw std::runtime_error("Matrices don't have the right dimensions for multiplication");
437  }
438 
439  Matrix<M, Q, T> res;
440 
441  for(int i=0; i<M; ++i)
442  {
443  for(int j=0; j<Q; ++j)
444  {
445  res[i][j] = dot(transpose(m1.getRow(i)), m2.getCol(j));
446  }
447  }
448 
449  return res;
450 }
451 
452 } // matrix
453 
454 } // yage
455 
456 #endif
int rowSize() const
Returns the row size of the Matrix.
Definition: matrix.hpp:101
+
int colSize() const
Returns the column size of the Matrixxs.
Definition: matrix.hpp:107
+
2D Vector class.
Definition: matrix.hpp:353
+
std::vector< Type > data_
Vector containing the data of the matrix.
Definition: matrix.hpp:94
+
Matrix< M, Q, T > multiply(const Matrix< M, N, T > &m1, const Matrix< P, Q, T > &m2)
Multiplies two matrices together.
Definition: matrix.hpp:432
+
Matrix< N, M, T > transpose(const Matrix< M, N, T > &m)
Transposes a matrix and returns the result.
Definition: matrix.hpp:398
+
Base Matrix class used by other similar classes.
Definition: matrix.hpp:35
+
T dot(const Matrix< R, 1, T > &m1, const Matrix< R, 1, T > &m2)
Returns the dot product between two vectors.
Definition: matrix.hpp:415
+
Matrix< 1, Cols, Type > getRow(int row) const
Return the row specified row as a Matrix with only one row.
Definition: matrix.hpp:118
Definition: camera2d.hpp:17
-- cgit