Ray Tracer Common Project
Image rendering program based on the ray tracing technique.
matrix.hpp
1 
15 #pragma once
16 
17 #include <iostream>
18 
19 namespace rt{
20 
21 class vector;
22 
33 class matrix{
34 public:
38  enum Format{
41  };
42 
46  matrix();
47 
51  matrix(const matrix &);
52 
58  matrix(double *data, Format format = RowMajorFormat);
59 
65  matrix(double m11, double m12, double m13, double m14, double m21, double m22, double m23, double m24, double m31, double m32, double m33, double m34, double m41, double m42, double m43, double m44);
66 
72  void set(double m11, double m12, double m13, double m14, double m21, double m22, double m23, double m24, double m31, double m32, double m33, double m34, double m41, double m42, double m43, double m44);
73 
79  void optimize();
80 
84  void setToIdentity();
85 
89  bool isIdentity() const;
90 
94  double determinant() const;
95 
102  void invert(bool *invertible = 0);
103 
107  void transpose();
108 
112  void translate(const vector &);
113 
119  void translate(double x, double y, double z);
120 
124  void scale(const vector &);
125 
129  void scale(double x, double y, double z);
130 
134  void scale(double factor);
135 
139  void rotate(double angle, const vector &);
140 
144  void rotate(double angle, double x, double y, double z = 0.0f);
145 
146  matrix inverted(bool *invertible = 0) const;
147  matrix transposed() const;
148  matrix translated(const vector &) const;
149  matrix translated(double x, double y, double z) const;
150  matrix scaled(const vector &) const;
151  matrix scaled(double x, double y, double z) const;
152  matrix scaled(double factor) const;
153  matrix rotated(double angle, const vector &) const;
154  matrix rotated(double angle, double x, double y, double z) const;
155 
156  void lookAt(const vector & eye, const vector & center, const vector & up);
157  vector position() const;
158  vector rotation() const;
159  vector scale() const; // TODO
160 
161  double at(int row, int column) const;
162  vector map(const vector &) const;
163 
164  const double & operator()(int row, int column) const;
165  double & operator()(int row, int column);
166 
167  matrix& operator +=(const matrix &);
168  matrix& operator -=(const matrix &);
169  matrix& operator *=(const matrix &);
170  matrix& operator *=(double);
171  bool operator ==(const matrix &) const;
172  bool operator !=(const matrix &) const;
173 
174  friend matrix operator+(const matrix& m1, const matrix& m2);
175  friend matrix operator-(const matrix& m1, const matrix& m2);
176  friend matrix operator*(const matrix& m1, const matrix& m2);
177  friend vector operator*(const matrix& m, const vector& v);
178  friend vector operator*(const vector& v, const matrix& m);
179  friend matrix operator-(const matrix& m);
180  friend matrix operator*(double, const matrix& m);
181  friend matrix operator*(const matrix& m, double);
182 
183  const double *data() const; // column-major
184 
185 private:
186  enum MatrixFlags{
187  Any = 0,
188  Identity = 1,
189  Translation = 2,
190  Rotation = 4,
191  Scale = 8,
192  Perspective = 16,
193  Ortho = 32
194  };
195 
196  double _data[4][4]; // column-major
197  mutable int _flags;
198 };
199 
200 rt::matrix operator+(const rt::matrix& m1, const rt::matrix& m2);
201 rt::matrix operator-(const rt::matrix& m1, const rt::matrix& m2);
202 rt::matrix operator*(const rt::matrix& m1, const rt::matrix& m2);
203 rt::vector operator*(const rt::vector& vector, const rt::matrix& matrix);
204 rt::vector operator*(const rt::matrix& matrix, const rt::vector& vector);
205 rt::matrix operator-(const rt::matrix& matrix);
206 rt::matrix operator*(double factor, const rt::matrix& matrix);
207 rt::matrix operator*(const rt::matrix& matrix, double factor);
208 
209 }
210 
211 std::ostream & operator<<(std::ostream &, const rt::matrix & m);
212 std::ostream & operator<<(std::ostream &, const rt::vector & v);
void transpose()
Transpose the matrix.
Definition: matrix.cpp:204
Definition: matrix.hpp:39
void rotate(double angle, const vector &)
Rotate the matrix.
Definition: matrix.cpp:290
Format
Matrix format enum.
Definition: matrix.hpp:38
matrix()
Construct a Identity matrix.
Definition: matrix.cpp:12
void invert(bool *invertible=0)
Invert the matrix.
Definition: matrix.cpp:136
double determinant() const
Compute matrix determinant.
Definition: matrix.cpp:132
Definition: bitmap.cpp:4
void translate(const vector &)
Translate the matrix.
Definition: matrix.cpp:215
3D vector
Definition: vector.hpp:28
void setToIdentity()
set matrix to identity.
Definition: matrix.cpp:90
bool isIdentity() const
Definition: matrix.cpp:96
void optimize()
Optimize the matrix.
Definition: matrix.cpp:58
4x4 matrix
Definition: matrix.hpp:33
Definition: matrix.hpp:40
color operator*(double f, const color &c)
Same as color::operator*(double).