# Module trafo: Linear transformations¶

With the trafo module PyX supports linear transformations, which can then be applied to canvases, Bézier paths and other objects. It consists of the main class trafo representing a general linear transformation and subclasses thereof, which provide special operations like translation, rotation, scaling, and mirroring.

## Class trafo¶

The trafo class represents a general linear transformation, which is defined for a vector $$\vec{x}$$ as

$\vec{x}' = \mathsf{A}\, \vec{x} + \vec{b}\ ,$

where $$\mathsf{A}$$ is the transformation matrix and $$\vec{b}$$ the translation vector. The transformation matrix must not be singular, i.e. we require $$\det \mathsf{A} \ne 0$$.

Multiple trafo instances can be multiplied, corresponding to a consecutive application of the respective transformation. Note that trafo1*trafo2 means that trafo1 is applied after trafo2, i.e. the new transformation is given by $$\mathsf{A} = \mathsf{A}_1 \mathsf{A}_2$$ and $$\vec{b} = \mathsf{A}_1 \vec{b}_2 + \vec{b}_1$$. Use the trafo methods described below, if you prefer thinking the other way round. The inverse of a transformation can be obtained via the trafo method inverse(), defined by the inverse $$\mathsf{A}^{-1}$$ of the transformation matrix and the translation vector $$-\mathsf{A}^{-1}\vec{b}$$.

class trafo.trafo(matrix=((1, 0), (0, 1)), vector=(0, 0))

create new trafo instance with transformation matrix and vector

trafo.apply(x, y)

apply trafo to point vector $$(\mathtt{x}, \mathtt{y})$$.

trafo.inverse()

returns inverse transformation of trafo.

trafo.mirrored(angle)

returns trafo followed by mirroring at line through $$(0,0)$$ with direction angle in degrees.

trafo.rotated(angle, x=None, y=None)

returns trafo followed by rotation by angle degrees around point $$(\mathtt{x}, \mathtt{y})$$, or $$(0,0)$$, if not given.

trafo.scaled(sx, sy=None, x=None, y=None)

returns trafo followed by scaling with scaling factor sx in $$x$$-direction, sy in $$y$$-direction ($$\mathtt{sy}=\mathtt{sx}$$, if not given) with scaling center $$(\mathtt{x}, \mathtt{y})$$, or $$(0,0)$$, if not given.

trafo.slanted(a, angle=0, x=None, y=None)

returns trafo followed by slant by angle around point $$(\mathtt{x}, \mathtt{y})$$, or $$(0,0)$$, if not given.

trafo.translated(x, y)

returns trafo followed by translation by vector $$(\mathtt{x}, \mathtt{y})$$.

## Subclasses of trafo¶

The trafo module provides a number of subclasses of the trafo class, each of which corresponds to one trafo method.

class trafo.mirror(angle)

mirroring at line through $$(0,0)$$ with direction angle in degrees.

class trafo.rotate(angle, x=None, y=None)

rotation by angle degrees around point $$(\mathtt{x}, \mathtt{y})$$, or $$(0,0)$$, if not given.

class trafo.scale(sx, sy=None, x=None, y=None)

scaling with scaling factor sx in $$x$$-direction, sy in $$y$$-direction ($$\mathtt{sy}=\mathtt{sx}$$, if not given) with scaling center $$(\mathtt{x}, \mathtt{y})$$, or $$(0,0)$$, if not given.

class trafo.slant(a, angle=0, x=None, y=None)

slant by angle around point $$(\mathtt{x}, \mathtt{y})$$, or $$(0,0)$$, if not given.

class trafo.translate(x, y)

translation by vector $$(\mathtt{x}, \mathtt{y})$$.