Computing 2D affine transformations using only matrix multiplication

Chandler Abraham
Jan 12, 2018 · 3 min read

This is a short visual description of computing a 2D affine transformation using a single matrix multiplication step, something that requires a bit of dimensional trickery. I’m trying to get better at check-pointing my math knowledge when I figure things out.


Say you have a bunch of points in two dimensional space (R2) and you want to translate (shift) them by 2 on the x axis.

You could formulate that with vector addition like so:

Image for post
Image for post

There’s a problem though, shifting all points to the right also means that your operation is going to shift the origin [0,0] to the right. This disqualifies this function from being a linear transformation.

Linear transformations have to preserve zero. They also can be expressed with a single matrix multiplication, no vector addition step needed. An example is the linear transformation for a rotation about the origin.

Image for post
Image for post

Combining a linear transformation like rotation with a translation step is a very common operation and it qualifies as a different type of transformation, an affine transformation.

Image for post
Image for post

An affine transformation has fewer rules, it no longer needs to preserve the origin it just has to keep straight lines straight and some other stuff

Affine operations like ‘rotate and translate’ are pretty useful and it would be helpful we could express them as a single matrix multiplication (Ax) instead of a multiplication and a vector addition (Ax + b).

It turns out that affine transformations in 2D can be represented as linear transformations in 3D. First let’s hoist our 2D space into 3D by making it a plane at z = 1.

Image for post
Image for post

Notice the old origin is now at (0,0,1) in our 3D space. This means we are free to map it to a value other than itself, as long as we preserve the 3D origin (0,0,0).

Here’s the recipe:

Image for post
Image for post
Image for post
Image for post

Since z is always 1 on our plane, b1 and b1 become constant additions, you can see this if you work it out a bit.

Image for post
Image for post

This lets us translate points on our plane by b amount

Image for post
Image for post

For any value of Z other than 1 (values not on our plane) b1 and b2 would end up scaled. We have effectively found a shearing of 3D space that happens to be our desired translation only at our plane. And if you work it out [0,0,0] is still mapped to [0,0,0] by this matrix.

You’re left with a translated point on your plane, now you can just drop the z component (which will be 1) and you’re back in your 2D space.

If you’re still trying to visualize how objects on the plane move but the 3D origin doesn’t just look up shears. In 2D you can see that a sheer leaves 0,0 alone.

Image for post
Image for post

Color and Imaging

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch

Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore

Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store