# Maths - Calculation of Matrix for 2D Rotation about a point

### Result

First we state the result, then we will go on to derive and explain it.

 xout yout 1
=
 r00 r01 x - r00*x - r01*y r10 r11 y - r10*x - r11*y 0 0 1
 xin yin 1

where:

• r00 = cos(θ), r01 = -sin(θ), r10 = sin(θ), r11 = cos(θ)
• θ = angle we are rotating around (in appropriate units for the trig functions we are using)
• xin,yin = the coordinates of the input point
• xout,yout = the coordinates of the output point (the result)
• x,y = the coordinates of the point that we are rotating around.

Or multiplying out the matrix and vector terms to give in ordinary equations:

xout = r00* xin + r01* yin + x - r00*x - r01*y
yout = r10* xin + r11* yin + y - r10*x - r11*y

### Explanation

In order to calculate the rotation about any arbitrary point we need to calculate its new rotation and translation. In other words rotation about a point is an 'proper' isometry transformation' which means that it has a linear and a rotational component.

Assume we have a matrix [R0] which defines a rotation about the origin:

We now want to apply this same rotation but about an arbitrary point P:

As we can see its orientation is the same as if it had been rotated about the origin, but it has been translated to a different point on space by the rotation.

In order to prove this and to calculate the amount of linear translation we need to replace:

• translate about arbitrary point P (Px,Py).

With the following 3 simpler transforms which, when done in order, are equivalent:

• translate the arbitrary point to the origin (subtract P which is translate by -Px,-Py)
• rotate about the origin (can use 2×2 matrix R0)
• then translate back. (add P which is translate by +Px,+Py)

So if we are using the global frame-of-reference (as explained here) then,

[resulting transform] = [third transform] * [second transform] * [first transform]

[resulting transform] = [+Px,+Py] * [rotation] * [-Px,-Py]

Note for matrix algebra, the order of operations is important, so these translations do not cancel out.

So matrix representing rotation about a given point is:

[R] = [T]-1 * [R0] * [T]

where:

[T]-1 = inverse transform = translation of point to origin

 1 0 x 0 1 y 0 0 1

[R0] = rotation about origin (if this is not clear see this discussion)

 r00 = cos(θ) r01 = -sin(θ) 0 r10 = sin(θ) r11 = cos(θ) 0 0 0 1

[T] = translation of origin to point

 1 0 -x 0 1 -y 0 0 1

when these matrices are multiplied this will give the following result for rotation about x,y:

 1 0 x 0 1 y 0 0 1
*
 r00 r01 0 r10 r11 0 0 0 1
*
 1 0 -x 0 1 -y 0 0 1

multiply out second pair

 1 0 x 0 1 y 0 0 1
*
 r00 r01 -r00*x - r01*y r10 r11 -r10*x - r11*y 0 0 1

multiply remaining pair:

 r00 r01 x - r00*x - r01*y r10 r11 y - r10*x - r11*y 0 0 1

So the rotational components are the same but the rotation moves the position of the centre.