diff --git a/fsl/utils/transform.py b/fsl/utils/transform.py index 481ae420f238911a35a218ccb169c98e71976b95..6932b6303fa943ec965cb502e715b9e4e0e53e43 100644 --- a/fsl/utils/transform.py +++ b/fsl/utils/transform.py @@ -11,6 +11,7 @@ spaces. The following functions are provided: :nosignatures: transform + transformNormal scaleOffsetXform invert concat @@ -437,8 +438,8 @@ def transform(p, xform, axes=None, vector=False): :arg p: A sequence or array of points of shape :math:`N \\times 3`. - :arg xform: An affine transformation matrix with which to transform the - points in ``p``. + :arg xform: A ``(4, 4)`` affine transformation matrix with which to + transform the points in ``p``. :arg axes: If you are only interested in one or two axes, and the source axes are orthogonal to the target axes (see the note below), @@ -448,7 +449,8 @@ def transform(p, xform, axes=None, vector=False): :arg vector: Defaults to ``False``. If ``True``, the points are treated as vectors - the translation component of the transformation - is not applied. + is not applied. If you set this flag, you pass in a ``(3, 3)`` + transformation matrix. :returns: The points in ``p``, transformed by ``xform``, as a ``numpy`` array with the same data type as the input. @@ -476,6 +478,14 @@ def transform(p, xform, axes=None, vector=False): else: return t +def transformNormal(p, xform, axes=None): + """Transforms the given point(s), under the assumption that they + are normal vectors. In this case, the points are transformed by + ``invert(xform[:3, :3]).T``. + """ + return transform(p, invert(xform[:3, :3]).T, axes, vector=True) + + def _fillPoints(p, axes): """Used by the :func:`transform` function. Turns the given array p into a ``N*3`` array of ``x,y,z`` coordinates. The array p may be a 1D array,