
Math behind rotation in MS Paint (2011) - namelost
https://math.stackexchange.com/questions/47255/math-behind-rotation-in-ms-paint
======
raphlinus
The book "Digital Image Warping" by George Wolberg[0] goes into these tricks
in great detail, as well as choices for the resampling filter.

The world is very different today, bilinear texture sampling is built into GPU
hardware and is lightning fast. The idea that a sequence of skews might be
more efficient is a curious relic of when CPU was considered a reasonable
place to do image transformation.

[0]: [https://www.amazon.com/Digital-Image-Warping-George-
Wolberg/...](https://www.amazon.com/Digital-Image-Warping-George-
Wolberg/dp/0818689447)

~~~
exDM69
I think that using a series of skew operations for rotation could still be
useful. Bilinear/trilinear texture lookup will always look a bit blurry. Most
graphics processing apps are still done using the CPU for most basic
operations. And when the GPU is used, it's mostly compute shaders to get bit-
accurate results (they could still be using the texture unit, though).

Real time graphics is of course a different matter.

~~~
gugagore
That's interesting. The sheer operations still require interpolation (just
that, you don't need to do 2D interpolation, 1D works out), so you still need
to interpolate.

And the scaling also requires interpolation. So I'm not sure if it's better or
worse in terms of bluriness.

~~~
exDM69
> The sheer operations still require interpolation (just that, you don't need
> to do 2D interpolation, 1D works out),

Back in the day, the "rotozoom" coefficients were chosen at a nearest integer
to avoid interpolation. This of course means that you can't continuously
choose the value of the angle. Interpolation doesn't play nice with a palette-
based image with a fixed number of colors anyway.

When palette and integers are not a restriction, higher quality interpolation
(bicubic, etc) is also an option. Comes with tradeoffs, of course.

Using integer coefficients will also enable all kinds of opportunities for
assembly-level optimization.

~~~
gugagore
I see! But scaling surely requires 2D interpolation, then, right?

~~~
exDM69
Scaling requires interpolation, but nearest neighbor sampling was good and
fast enough for old school rotozoom effect.

------
chestervonwinch
Another way to approach this is to compute the LDU decomposition of the
rotation matrix. L and U are shears while D is the scaling in the horizontal
and vertical directions.

------
baristaGeek
I remember taking Linear Algebra and learning how to rotate shapes in order to
be able to find their area. You learn that rotations are essentially a linear
transformation (btw, just like function derivatives, which I find to be super
cool), which is what the guy on StackOverflow is doing. Pretty clever!

~~~
catnaroek
> You learn that rotations are essentially[sic] a[sic] linear transformation

Rotations about the origin are linear transformations. Rotations about an
arbitrary point are affine transformations.

~~~
baristaGeek
Thanks! Didn't know that.

------
nurettin
How is a rotation matrix "a trick"? It is just ordinary highschool maths.

~~~
JosephRedfern
This is about achieving rotation through a combination of skewing and scaling
about X and Y, not just about a direct application of a rotation matrix.

It's a trick because to many it's not immediately obvious (even if you know
about transformation matrices).

This is exactly the kind of thing I visit HN for -- the demonstration and
explanation of an interesting hack. You may not have found it interesting,
which is perfectly fine, but please don't assume that others didn't.

