.. module:: trafo ******************************************* Module :mod:`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 :class:`trafo` ==================== The ``trafo`` class represents a general linear transformation, which is defined for a vector :math:`\vec{x}` as .. math:: \vec{x}' = \mathsf{A}\, \vec{x} + \vec{b}\ , where :math:`\mathsf{A}` is the transformation matrix and :math:`\vec{b}` the translation vector. The transformation matrix must not be singular, *i.e.* we require :math:`\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 :math:`\mathsf{A} = \mathsf{A}_1 \mathsf{A}_2` and :math:`\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 :math:`\mathsf{A}^{-1}` of the transformation matrix and the translation vector :math:`-\mathsf{A}^{-1}\vec{b}`. .. class:: trafo(matrix=((1,0),(0,1)), vector=(0,0)) create new ``trafo`` instance with transformation ``matrix`` and ``vector`` .. method:: apply(x, y) apply ``trafo`` to point vector :math:`(\mathtt{x}, \mathtt{y})`. .. method:: inverse() returns inverse transformation of ``trafo``. .. method:: mirrored(angle) returns ``trafo`` followed by mirroring at line through :math:`(0,0)` with direction ``angle`` in degrees. .. method:: rotated(angle, x=None, y=None) returns ``trafo`` followed by rotation by ``angle`` degrees around point :math:`(\mathtt{x}, \mathtt{y})`, or :math:`(0,0)`, if not given. .. method:: scaled(sx, sy=None, x=None, y=None) returns ``trafo`` followed by scaling with scaling factor ``sx`` in :math:`x`\ -direction, ``sy`` in :math:`y`\ -direction (:math:`\mathtt{sy}=\mathtt{sx}`, if not given) with scaling center :math:`(\mathtt{x}, \mathtt{y})`, or :math:`(0,0)`, if not given. .. method:: slanted(a, angle=0, x=None, y=None) returns ``trafo`` followed by slant by ``angle`` around point :math:`(\mathtt{x}, \mathtt{y})`, or :math:`(0,0)`, if not given. .. method:: translated(x, y) returns ``trafo`` followed by translation by vector :math:`(\mathtt{x}, \mathtt{y})`. Subclasses of :class:`trafo` ============================ The ``trafo`` module provides a number of subclasses of the ``trafo`` class, each of which corresponds to one ``trafo`` method. .. class:: mirror(angle) mirroring at line through :math:`(0,0)` with direction ``angle`` in degrees. .. class:: rotate(angle, x=None, y=None) rotation by ``angle`` degrees around point :math:`(\mathtt{x}, \mathtt{y})`, or :math:`(0,0)`, if not given. .. class:: scale(sx, sy=None, x=None, y=None) scaling with scaling factor ``sx`` in :math:`x`\ -direction, ``sy`` in :math:`y`\ -direction (:math:`\mathtt{sy}=\mathtt{sx}`, if not given) with scaling center :math:`(\mathtt{x}, \mathtt{y})`, or :math:`(0,0)`, if not given. .. class:: slant(a, angle=0, x=None, y=None) slant by ``angle`` around point :math:`(\mathtt{x}, \mathtt{y})`, or :math:`(0,0)`, if not given. .. class:: translate(x, y) translation by vector :math:`(\mathtt{x}, \mathtt{y})`.