23 double m11,
double m12,
double m13,
double m14,
24 double m21,
double m22,
double m23,
double m24,
25 double m31,
double m32,
double m33,
double m34,
26 double m41,
double m42,
double m43,
double m44
50 const double *
data = *m;
51 const double *otherData = *( other.m );
52 for (
int i = 0; i < 16; ++i,
data++, otherData++ )
65 m[3][0] += m[0][0] * vector.
x() + m[1][0] * vector.
y() + m[2][0] * vector.
z();
66 m[3][1] += m[0][1] * vector.
x() + m[1][1] * vector.
y() + m[2][1] * vector.
z();
67 m[3][2] += m[0][2] * vector.
x() + m[1][2] * vector.
y() + m[2][2] * vector.
z();
68 m[3][3] += m[0][3] * vector.
x() + m[1][3] * vector.
y() + m[2][3] * vector.
z();
75 for (
int i = 0; i < 16; ++i )
77 res.append( m[i / 4][i % 4] );
86 x = vector.
x() * matrix.m[0][0] + vector.
y() * matrix.m[1][0] + vector.
z() * matrix.m[2][0] + matrix.m[3][0];
87 y = vector.
x() * matrix.m[0][1] + vector.
y() * matrix.m[1][1] + vector.
z() * matrix.m[2][1] + matrix.m[3][1];
88 z = vector.
x() * matrix.m[0][2] + vector.
y() * matrix.m[1][2] + vector.
z() * matrix.m[2][2] + matrix.m[3][2];
89 w = vector.
x() * matrix.m[0][3] + vector.
y() * matrix.m[1][3] + vector.
z() * matrix.m[2][3] + matrix.m[3][3];
101 vector.
x() * m[0][0] + vector.
y() * m[1][0] + vector.
z() * m[2][0],
103 vector.
x() * m[0][1] + vector.
y() * m[1][1] + vector.
z() * m[2][1],
105 vector.
x() * m[0][2] + vector.
y() * m[1][2] + vector.
z() * m[2][2]
111 if ( m[0][0] != 1.0 || m[0][1] != 0.0 || m[0][2] != 0.0 )
113 if ( m[0][3] != 0.0 || m[1][0] != 0.0 || m[1][1] != 1.0 )
115 if ( m[1][2] != 0.0 || m[1][3] != 0.0 || m[2][0] != 0.0 )
117 if ( m[2][1] != 0.0 || m[2][2] != 1.0 || m[2][3] != 0.0 )
119 if ( m[3][0] != 0.0 || m[3][1] != 0.0 || m[3][2] != 0.0 )
121 return ( m[3][3] == 1.0 );
148 m.m[0][0] = m1.m[0][0] * m2.m[0][0] + m1.m[1][0] * m2.m[0][1] + m1.m[2][0] * m2.m[0][2] + m1.m[3][0] * m2.m[0][3];
149 m.m[0][1] = m1.m[0][1] * m2.m[0][0] + m1.m[1][1] * m2.m[0][1] + m1.m[2][1] * m2.m[0][2] + m1.m[3][1] * m2.m[0][3];
150 m.m[0][2] = m1.m[0][2] * m2.m[0][0] + m1.m[1][2] * m2.m[0][1] + m1.m[2][2] * m2.m[0][2] + m1.m[3][2] * m2.m[0][3];
151 m.m[0][3] = m1.m[0][3] * m2.m[0][0] + m1.m[1][3] * m2.m[0][1] + m1.m[2][3] * m2.m[0][2] + m1.m[3][3] * m2.m[0][3];
153 m.m[1][0] = m1.m[0][0] * m2.m[1][0] + m1.m[1][0] * m2.m[1][1] + m1.m[2][0] * m2.m[1][2] + m1.m[3][0] * m2.m[1][3];
154 m.m[1][1] = m1.m[0][1] * m2.m[1][0] + m1.m[1][1] * m2.m[1][1] + m1.m[2][1] * m2.m[1][2] + m1.m[3][1] * m2.m[1][3];
155 m.m[1][2] = m1.m[0][2] * m2.m[1][0] + m1.m[1][2] * m2.m[1][1] + m1.m[2][2] * m2.m[1][2] + m1.m[3][2] * m2.m[1][3];
156 m.m[1][3] = m1.m[0][3] * m2.m[1][0] + m1.m[1][3] * m2.m[1][1] + m1.m[2][3] * m2.m[1][2] + m1.m[3][3] * m2.m[1][3];
158 m.m[2][0] = m1.m[0][0] * m2.m[2][0] + m1.m[1][0] * m2.m[2][1] + m1.m[2][0] * m2.m[2][2] + m1.m[3][0] * m2.m[2][3];
159 m.m[2][1] = m1.m[0][1] * m2.m[2][0] + m1.m[1][1] * m2.m[2][1] + m1.m[2][1] * m2.m[2][2] + m1.m[3][1] * m2.m[2][3];
160 m.m[2][2] = m1.m[0][2] * m2.m[2][0] + m1.m[1][2] * m2.m[2][1] + m1.m[2][2] * m2.m[2][2] + m1.m[3][2] * m2.m[2][3];
161 m.m[2][3] = m1.m[0][3] * m2.m[2][0] + m1.m[1][3] * m2.m[2][1] + m1.m[2][3] * m2.m[2][2] + m1.m[3][3] * m2.m[2][3];
163 m.m[3][0] = m1.m[0][0] * m2.m[3][0] + m1.m[1][0] * m2.m[3][1] + m1.m[2][0] * m2.m[3][2] + m1.m[3][0] * m2.m[3][3];
164 m.m[3][1] = m1.m[0][1] * m2.m[3][0] + m1.m[1][1] * m2.m[3][1] + m1.m[2][1] * m2.m[3][2] + m1.m[3][1] * m2.m[3][3];
165 m.m[3][2] = m1.m[0][2] * m2.m[3][0] + m1.m[1][2] * m2.m[3][1] + m1.m[2][2] * m2.m[3][2] + m1.m[3][2] * m2.m[3][3];
166 m.m[3][3] = m1.m[0][3] * m2.m[3][0] + m1.m[1][3] * m2.m[3][1] + m1.m[2][3] * m2.m[3][2] + m1.m[3][3] * m2.m[3][3];
172 m[0][0] *= vector.
x();
173 m[0][1] *= vector.
x();
174 m[0][2] *= vector.
x();
175 m[0][3] *= vector.
x();
177 m[1][0] *= vector.
y();
178 m[1][1] *= vector.
y();
179 m[1][2] *= vector.
y();
180 m[1][3] *= vector.
y();
182 m[2][0] *= vector.
z();
183 m[2][1] *= vector.
z();
184 m[2][2] *= vector.
z();
185 m[2][3] *= vector.
z();
190 const double length = std::sqrt( x * x + y * y + z * z );
196 const double nx = x / length;
197 const double ny = y / length;
198 const double nz = z / length;
200 const double angleRad = angle * M_PI / 180.0;
201 const double angleCos = std::cos( angleRad );
202 const double angleSin = std::sin( angleRad );
203 const double angleCosInv = 1.0 - angleCos;
205 const double nxny = nx * ny;
206 const double nxnz = nx * nz;
207 const double nynz = ny * nz;
211 rot.m[0][0] = angleCosInv * nx * nx + angleCos;
212 rot.m[0][1] = angleCosInv * nxny + nz * angleSin;
213 rot.m[0][2] = angleCosInv * nxnz - ny * angleSin;
216 rot.m[1][0] = angleCosInv * nxny - nz * angleSin;
217 rot.m[1][1] = angleCosInv * ny * ny + angleCos;
218 rot.m[1][2] = angleCosInv * nynz + nx * angleSin;
221 rot.m[2][0] = angleCosInv * nxnz + ny * angleSin;
222 rot.m[2][1] = angleCosInv * nynz - nx * angleSin;
223 rot.m[2][2] = angleCosInv * nz * nz + angleCos;
236 rotate( angle, vector.
x(), vector.
y(), vector.
z() );
239static inline double matrixDet2(
const double m[4][4],
int col0,
int col1,
int row0,
int row1 )
241 return m[col0][row0] * m[col1][row1] - m[col0][row1] * m[col1][row0];
252static inline double matrixDet3(
const double m[4][4],
int col0,
int col1,
int col2,
int row0,
int row1,
int row2 )
254 return m[col0][row0] * matrixDet2( m, col1, col2, row1, row2 ) - m[col1][row0] * matrixDet2( m, col0, col2, row1, row2 ) + m[col2][row0] * matrixDet2( m, col0, col1, row1, row2 );
258static inline double matrixDet4(
const double m[4][4] )
261 det = m[0][0] * matrixDet3( m, 1, 2, 3, 1, 2, 3 );
262 det -= m[1][0] * matrixDet3( m, 0, 2, 3, 1, 2, 3 );
263 det += m[2][0] * matrixDet3( m, 0, 1, 3, 1, 2, 3 );
264 det -= m[3][0] * matrixDet3( m, 0, 1, 2, 1, 2, 3 );
272 return matrixDet4( m );
QgsVector3D mapVector(const QgsVector3D &vector) const
Maps vector by multiplying the top 3x3 portion of this matrix by vector.
void scale(const QgsVector3D &vector)
Multiplies this matrix by another that scales coordinates by the components of a vector.
QgsMatrix4x4()
Initializes identity matrix.
void setToIdentity()
Sets matrix to be identity matrix.
bool isIdentity() const
Returns whether this matrix is an identity matrix.
void translate(const QgsVector3D &vector)
Multiplies this matrix by another that translates coordinates by the components of a vector.
bool fuzzyEqual(const QgsMatrix4x4 &other, double epsilon=1e-8) const
Performs fuzzy comparison between this matrix and other using an epsilon.
void rotate(double angle, double x, double y, double z)
Multiples this matrix by another that rotates coordinates through angle degrees about the vector (x,...
double determinant() const
Returns the determinant of this matrix.
double * data()
Returns pointer to the matrix data (stored in column-major order).
QList< double > dataList() const
Returns matrix data (in column-major order).
A 3D vector (similar to QVector3D) with the difference that it uses double precision instead of singl...
double y() const
Returns Y coordinate.
double z() const
Returns Z coordinate.
double x() const
Returns X coordinate.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
QgsVector3D operator*(const QgsMatrix4x4 &matrix, const QgsVector3D &vector)
Matrix-vector multiplication (vector is converted to homogeneous coordinates [X,Y,...