NAME

Image::Leptonica::Func::affinecompose

VERSION

version 0.04

affinecompose.c

affinecompose.c

    Composable coordinate transforms
         l_float32   *createMatrix2dTranslate()
         l_float32   *createMatrix2dScale()
         l_float32   *createMatrix2dRotate()

    Special coordinate transforms on pta
         PTA         *ptaTranslate()
         PTA         *ptaScale()
         PTA         *ptaRotate()

    Special coordinate transforms on boxa
         BOXA        *boxaTranslate()
         BOXA        *boxaScale()
         BOXA        *boxaRotate()

    General coordinate transform on pta and boxa
         PTA         *ptaAffineTransform()
         BOXA        *boxaAffineTransform()

    Matrix operations
         l_int32      l_productMatVec()
         l_int32      l_productMat2()
         l_int32      l_productMat3()
         l_int32      l_productMat4()

FUNCTIONS

boxaAffineTransform

BOXA * boxaAffineTransform ( BOXA *boxas, l_float32 *mat )

boxaAffineTransform()

    Input:  boxas
            mat  (3x3 transform matrix; canonical form)
    Return: boxad  (transformed boxas), or null on error

boxaRotate

BOXA * boxaRotate ( BOXA *boxas, l_float32 xc, l_float32 yc, l_float32 angle )

boxaRotate()

    Input:  boxas
            (xc, yc)  (location of center of rotation)
            angle  (rotation in radians; clockwise is positive)
    Return: boxad  (scaled boxas), or null on error

Notes;
    (1) See createMatrix2dRotate() for details of transform.

boxaScale

BOXA * boxaScale ( BOXA *boxas, l_float32 scalex, l_float32 scaley )

boxaScale()

    Input:  boxas
            scalex  (horizontal scale factor)
            scaley  (vertical scale factor)
    Return: boxad  (scaled boxas), or null on error

Notes;
    (1) See createMatrix2dScale() for details of transform.

boxaTranslate

BOXA * boxaTranslate ( BOXA *boxas, l_float32 transx, l_float32 transy )

boxaTranslate()

    Input:  boxas
            transx  (x component of translation wrt. the origin)
            transy  (y component of translation wrt. the origin)
    Return: boxad  (translated boxas), or null on error

Notes;
    (1) See createMatrix2dTranslate() for details of transform.

createMatrix2dRotate

l_float32 * createMatrix2dRotate ( l_float32 xc, l_float32 yc, l_float32 angle )

createMatrix2dRotate()

    Input:  xc, yc  (location of center of rotation)
            angle  (rotation in radians; clockwise is positive)
    Return: 3x3 transform matrix, or null on error

Notes;
    (1) The rotation is equivalent to:
           v' = Av
        where v and v' are 1x3 column vectors in the form
           v = [x, y, 1]^    (^ denotes transpose)
        and the affine rotation matrix is
           A = [ cosa   -sina    xc*(1-cosa) + yc*sina
                 sina    cosa    yc*(1-cosa) - xc*sina
                   0       0                 1         ]

        If the rotation is about the origin, (xc, yc) = (0, 0) and
        this simplifies to
           A = [ cosa   -sina    0
                 sina    cosa    0
                   0       0     1 ]

        These relations follow from the following equations, which
        you can convince yourself are correct as follows.  Draw a
        circle centered on (xc,yc) and passing through (x,y), with
        (x',y') on the arc at an angle 'a' clockwise from (x,y).
        [ Hint: cos(a + b) = cosa * cosb - sina * sinb
                sin(a + b) = sina * cosb + cosa * sinb ]

          x' - xc =  (x - xc) * cosa - (y - yc) * sina
          y' - yc =  (x - xc) * sina + (y - yc) * cosa

createMatrix2dScale

l_float32 * createMatrix2dScale ( l_float32 scalex, l_float32 scaley )

createMatrix2dScale()

    Input:  scalex  (horizontal scale factor)
            scaley  (vertical scale factor)
    Return: 3x3 transform matrix, or null on error

Notes;
    (1) The scaling is equivalent to:
           v' = Av
        where v and v' are 1x3 column vectors in the form
           v = [x, y, 1]^    (^ denotes transpose)
        and the affine scaling matrix is
           A = [ sx  0    0
                 0   sy   0
                 0   0    1  ]

    (2) We consider scaling as with respect to a fixed origin.
        In other words, the origin is the only point that doesn't
        move in the scaling transform.

createMatrix2dTranslate

l_float32 * createMatrix2dTranslate ( l_float32 transx, l_float32 transy )

createMatrix2dTranslate()

    Input:  transx  (x component of translation wrt. the origin)
            transy  (y component of translation wrt. the origin)
    Return: 3x3 transform matrix, or null on error

Notes;
    (1) The translation is equivalent to:
           v' = Av
        where v and v' are 1x3 column vectors in the form
           v = [x, y, 1]^    (^ denotes transpose)
        and the affine tranlation matrix is
           A = [ 1   0   tx
                 0   1   ty
                 0   0    1  ]

    (2) We consider translation as with respect to a fixed origin.
        In a clipping operation, the origin moves and the points
        are fixed, and you use (-tx, -ty) where (tx, ty) is the
        translation vector of the origin.

l_productMat2

l_int32 l_productMat2 ( l_float32 *mat1, l_float32 *mat2, l_float32 *matd, l_int32 size )

l_productMat2()

    Input:  mat1  (square matrix, as a 1-dimensional size^2 array)
            mat2  (square matrix, as a 1-dimensional size^2 array)
            matd  (square matrix; product stored here)
            size (of matrices)
    Return: 0 if OK, 1 on error

l_productMat3

l_int32 l_productMat3 ( l_float32 *mat1, l_float32 *mat2, l_float32 *mat3, l_float32 *matd, l_int32 size )

l_productMat3()

    Input:  mat1  (square matrix, as a 1-dimensional size^2 array)
            mat2  (square matrix, as a 1-dimensional size^2 array)
            mat3  (square matrix, as a 1-dimensional size^2 array)
            matd  (square matrix; product stored here)
            size  (of matrices)
    Return: 0 if OK, 1 on error

l_productMat4

l_int32 l_productMat4 ( l_float32 *mat1, l_float32 *mat2, l_float32 *mat3, l_float32 *mat4, l_float32 *matd, l_int32 size )

l_productMat4()

    Input:  mat1  (square matrix, as a 1-dimensional size^2 array)
            mat2  (square matrix, as a 1-dimensional size^2 array)
            mat3  (square matrix, as a 1-dimensional size^2 array)
            mat4  (square matrix, as a 1-dimensional size^2 array)
            matd  (square matrix; product stored here)
            size  (of matrices)
    Return: 0 if OK, 1 on error

l_productMatVec

l_int32 l_productMatVec ( l_float32 *mat, l_float32 *vecs, l_float32 *vecd, l_int32 size )

l_productMatVec()

    Input:  mat  (square matrix, as a 1-dimensional @size^2 array)
            vecs (input column vector of length @size)
            vecd (result column vector)
            size (matrix is @size x @size; vectors are length @size)
    Return: 0 if OK, 1 on error

ptaAffineTransform

PTA * ptaAffineTransform ( PTA *ptas, l_float32 *mat )

ptaAffineTransform()

    Input:  ptas (for initial points)
            mat  (3x3 transform matrix; canonical form)
    Return: ptad  (transformed points), or null on error

ptaRotate

PTA * ptaRotate ( PTA *ptas, l_float32 xc, l_float32 yc, l_float32 angle )

ptaRotate()

    Input:  ptas (for initial points)
            (xc, yc)  (location of center of rotation)
            angle  (rotation in radians; clockwise is positive)
            (&ptad)  (<return> new locations)
    Return: 0 if OK; 1 on error

Notes;
    (1) See createMatrix2dScale() for details of transform.

ptaScale

PTA * ptaScale ( PTA *ptas, l_float32 scalex, l_float32 scaley )

ptaScale()

    Input:  ptas (for initial points)
            scalex  (horizontal scale factor)
            scaley  (vertical scale factor)
    Return: 0 if OK; 1 on error

Notes;
    (1) See createMatrix2dScale() for details of transform.

ptaTranslate

PTA * ptaTranslate ( PTA *ptas, l_float32 transx, l_float32 transy )

ptaTranslate()

    Input:  ptas (for initial points)
            transx  (x component of translation wrt. the origin)
            transy  (y component of translation wrt. the origin)
    Return: ptad  (translated points), or null on error

Notes;
    (1) See createMatrix2dTranslate() for details of transform.

AUTHOR

Zakariyya Mughal <zmughal@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2014 by Zakariyya Mughal.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.