In 2-D geometry, a coordinate pair (x, y)
can be thought of as a 2x1 matrix
(a vector). Affine
transformations
(including rotations, scales, translations and combinations of those) can be
represented by a 3x2 matrix F
:
[ Fa Fb Fc ]
[ Fd Fe Ff ]
Given a starting point S = (Sx, Sy)
, the transformed point T = (Tx, Ty)
is
given by two scalar equations:
Tx = (Fa * Sx) + (Fb * Sy) + Fc
Ty = (Fd * Sx) + (Fe * Sy) + Ff
There is an equivalent
homogenous form, where
the 3x2 matrix F
is augmented with a [0 0 1]
bottom row and the 2x1 vectors
S
and T
are augmented with a [1]
bottom element. Transformation becomes
equivalent to matrix multiplication, as these three scalar equations:
Tx = (Fa * Sx) + (Fb * Sy) + (Fc * 1)
Ty = (Fd * Sx) + (Fe * Sy) + (Ff * 1)
1 = ( 0 * Sx) + ( 0 * Sy) + ( 1 * 1)
Are equivalent to the one matrix equation T = F * S
:
[ Tx ] [ Fa Fb Fc ] [ Sx ]
[ Ty ] = [ Fd Fe Ff ] * [ Sy ]
[ 1 ] [ 0 0 1 ] [ 1 ]
That (augmented) forward matrix F
maps from S
to T
. As long as the
determinant FΔ
(see below) is non-zero, the inverse transformation, mapping
from T
to S
, exists. If so, it is also an affine transformation and
representable by a 3x2 (or augmented 3x3) backward matrix B
such that
S = B * T
:
[ Sx ] [ Ba Bb Bc ] [ Tx ]
[ Sy ] = [ Bd Be Bf ] * [ Ty ]
[ 1 ] [ 0 0 1 ] [ 1 ]
B
is the inverse of F
, and there is a formula for the inverse of a 3x3
matrix, but it’s somewhat messy in general. The formula can be simplified when
the bottom row is [0 0 1]
. I tried for a few minutes to find this simplified
formula online, but I failed. It was easy to simplify the general formula
myself, and since I did the algebra, I thought I might as well write it out as
this very blog post.
Specifically, the inverse B
of the 3x2 matrix F
(given at the top) is:
[ Ba Bb Bc ]
[ Bd Be Bf ]
Where:
FΔ = (Fa * Fe) - (Fb * Fd)
Ba = +Fe / FΔ
Bb = -Fb / FΔ
Bc = ((Fb * Ff) - (Fe * Fc)) / FΔ
Bd = -Fd / FΔ
Be = +Fa / FΔ
Bf = ((Fd * Fc) - (Fa * Ff)) / FΔ
As long as the determinant FΔ
is
non-zero (so that the F
matrix is invertible), it’s straightforward to
confirm that F * B = I
, the identity matrix (and likewise B * F = I
). For
example:
[ Fa Fb Fc ] [ +Fe/FΔ -Fb/FΔ ((Fb*Ff)-(Fe*Fc))/FΔ ] [ 1 0 0 ]
[ Fd Fe Ff ] * [ -Fd/FΔ +Fa/FΔ ((Fd*Fc)-(Fa*Ff))/FΔ ] = [ 0 1 0 ]
[ 0 0 1 ] [ 0 0 1 ] [ 0 0 1 ]
Published: 2021-12-30