Add method to translate QgsMatrix4x4 by QgsVector3D

This commit is contained in:
Nyall Dawson 2023-08-22 08:25:43 +10:00
parent 816c274bb4
commit c25596269f
4 changed files with 33 additions and 0 deletions

View File

@ -51,6 +51,11 @@ Initializes matrix by setting all values in row-major order
QList< double > dataList() const /PyName=data,HoldGIL/;
%Docstring
Returns matrix data (in column-major order)
%End
void translate( const QgsVector3D &vector );
%Docstring
Multiplies this matrix by another that translates coordinates by the components of a ``vector``.
%End
QgsVector3D map( const QgsVector3D &vector ) const /HoldGIL/;

View File

@ -29,6 +29,13 @@ QgsMatrix4x4::QgsMatrix4x4( double m11, double m12, double m13, double m14,
m[3][0] = m14; m[3][1] = m24; m[3][2] = m34; m[3][3] = m44;
}
void QgsMatrix4x4::translate( const QgsVector3D &vector )
{
m[3][0] += m[0][0] * vector.x() + m[1][0] * vector.y() + m[2][0] * vector.z();
m[3][1] += m[0][1] * vector.x() + m[1][1] * vector.y() + m[2][1] * vector.z();
m[3][2] += m[0][2] * vector.x() + m[1][2] * vector.y() + m[2][2] * vector.z();
m[3][3] += m[0][3] * vector.x() + m[1][3] * vector.y() + m[2][3] * vector.z();
}
QList< double > QgsMatrix4x4::dataList() const
{

View File

@ -71,6 +71,11 @@ class CORE_EXPORT QgsMatrix4x4
//! Returns matrix data (in column-major order)
QList< double > dataList() const SIP_PYNAME( data ) SIP_HOLDGIL;
/**
* Multiplies this matrix by another that translates coordinates by the components of a \a vector.
*/
void translate( const QgsVector3D &vector );
//! Matrix-vector multiplication (vector is converted to homogenous coordinates [X,Y,Z,1] and back)
QgsVector3D map( const QgsVector3D &vector ) const SIP_HOLDGIL
{

View File

@ -78,6 +78,22 @@ class TestQgsMatrix4x4(QgisTestCase):
13, 14, 15, 16])])
)
def test_translate(self):
"""
Test translating a matrix
"""
m = QgsMatrix4x4()
m.translate(QgsVector3D(1, 2, 3))
self.assertEqual(m.data(), [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 2.0, 3.0, 1.0])
m = QgsMatrix4x4(1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12,
0, 0, 0, 1)
m.translate(QgsVector3D(1, 2, 3))
self.assertEqual(m.data(), [1.0, 5.0, 9.0, 0.0, 2.0, 6.0, 10.0, 0.0, 3.0, 7.0, 11.0, 0.0, 18.0, 46.0, 74.0, 1.0])
if __name__ == '__main__':
unittest.main()