Формула для вращений около 0,0:
x1 = cos(theta) x0 - sin(theta) y0
y1 = sin(theta) x0 + cos(theta) y0
Но это для обычных осей, а вращение около 0,0. Вращение PIL осуществляется по часовой стрелке с «графическими» осями. Плюс, это вокруг центра изображения. Последнее, что сбивает с толку, заключается в том, что размер изображения может меняться, что необходимо учитывать в конечном результате.
Процедура: взять исходную точку, вычесть центр изображения, применить исправленное вращение "графические оси", найти новый размер изображения, добавить центральную позицию нового изображения.
Вращение с использованием графических осей:
x1 = cos(theta) x0 + sin(theta) y0
y1 = -sin(theta) x0 + cos(theta) y0
16,32 - 16,16 - это 0, 16. Поворот на 30 градусов по часовой стрелке (на основе ваших изображений) дает точку cos (-30) * 0 + sin (-30) * 16, -sin (-30 ) * 0 + cos (-30) * 16 = -8, 13,86. Последний шаг - добавление назад центральной позиции повернутой позиции.