Source code for arrlp.modules.transform_matrix_LP.transform_matrix
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Date : 2026-03-22
# Author : Lancelot PINCET
# GitHub : https://github.com/LancelotPincet
# Library : arrLP
# Module : transform_matrix
"""
Defines the 3x3 transformation matrix for affine transformation in 2D.
"""
# %% Libraries
import numpy as np
# %% Function
[docs]
def transform_matrix(shape=None, *, shiftx=0., shifty=0., shearx=0., sheary=0., angle=0., scalex=1., scaley=1., stacks=False) :
'''
Defines the 3x3 transformation matrix for affine transformation in 2D.
Parameters
----------
shape : int or tuple or np.ndarray
Describes the shape of the coordinates.
If int, all dimensions will have this value.
If tuple, corresponds to the shape.
shiftx : float
Shift value in x
shifty : float
Shift value in y
shearx : float
Shear value in x
sheary : float
Shear value in y
angle : float
Rotation angle [°]
scalex : float
Scale value in x
scaley : float
Scale value in y
Examples
--------
>>> from arrlp import transform_matrix
...
>>> matrix = transform_matrix(shape, shiftx=2, shifty=3.4)
'''
# Manage shape argument
if shape is None :
shape = (0, 0)
elif isinstance(shape, int) or isinstance(shape, float):
shape = (shape,) * 2
elif isinstance(shape, tuple) :
pass
else :
shape = shape.shape[:2] if not stacks else shape.shape[1:3]
h, w = shape
h, w = h/2, w/2
matrix = np.eye(3, dtype=np.float32)
if shearx != 0 or sheary != 0 :
matrix @= np.asarray([[1., 0., h],
[0., 1., w],
[0., 0., 1.]])
matrix @= np.asarray([[1., sheary, 0.],
[shearx, 1., 0.],
[0., 0., 1.]])
matrix @= np.asarray([[1., 0., -h],
[0., 1., -w],
[0., 0., 1.]])
if angle != 0 :
angle = -np.radians(angle)
matrix @= np.asarray([[1., 0., h],
[0., 1., w],
[0., 0., 1.]])
matrix @= np.asarray([[np.cos(angle), -np.sin(angle), 0.],
[np.sin(angle), np.cos(angle), 0.],
[0., 0., 1.]])
matrix @= np.asarray([[1., 0., -h],
[0., 1., -w],
[0., 0., 1.]])
if scalex != 1 or scaley != 1 :
matrix @= np.asarray([[1., 0., h],
[0., 1., w],
[0., 0., 1.]])
matrix @= np.asarray([[scaley, 0., 0.],
[0., scalex, 0.],
[0., 0., 1.]])
matrix @= np.asarray([[1., 0., -h],
[0., 1., -w],
[0., 0., 1.]])
if shiftx != 0 or shifty != 0 :
matrix @= np.asarray([[1., 0., shifty],
[0., 1., shiftx],
[0., 0., 1.]])
return matrix
# %% Test function run
if __name__ == "__main__":
from corelp import test
test(__file__)