Простое вращение всегда о происхождении.Простое вращение (в 2D) задается следующей матрицей преобразования (здесь я использую однородные координаты ):
⎡ r1 -r2 0 ⎤
R = ⎢ r2 r1 0 ⎥
⎣ 0 0 1 ⎦
r1
и r2
связаны в том, чтовместе они образуют единичный вектор (r1^2 + r2^2 = 1
).При вводе координат через это преобразование они вращаются вокруг начала координат.Например, учитывая вектор p
, мы поворачиваем его, умножая влево на R
.
Если вы хотите повернуть вокруг другой точки, скажем (c1
, c2
), вынужно перевести координаты так, чтобы эта новая точка переместилась в начало координат, затем применить вращение, а затем перевести обратно:
⎡ 1 0 c1 ⎤ ⎡ r1 -r2 0 ⎤ ⎡ 1 0 -c1 ⎤
T' R T = ⎢ 0 1 c2 ⎥ ⎢ r2 r1 0 ⎥ ⎢ 0 1 -c2 ⎥
⎣ 0 0 1 ⎦ ⎣ 0 0 1 ⎦ ⎣ 0 0 1 ⎦
Умножение этого дает:
⎡ r1 -r2 -r1*c1+r2*c2+c1 ⎤ ⎡ 1 0 -r1*c1+r2*c2+c1 ⎤ ⎡ r1 -r2 0 ⎤
T' R T = ⎢ r2 r1 -r2*c1-r1*c2+c2 ⎥ = ⎢ 0 1 -r2*c1-r1*c2+c2 ⎥ ⎢ r2 r1 0 ⎥
⎣ 0 0 1 ⎦ ⎣ 0 0 1 ⎦ ⎣ 0 0 1 ⎦
Итак, мыможно увидеть, что вместо этого мы можем просто вращаться вокруг начала координат, а затем переводить результат соответствующим образом, чтобы получить тот же результат, как если бы мы вращались вокруг выбранного центра вращения.
При наличии любой функции библиотеки обработки изображенийкоторый поворачивает изображение и дает полный результат (т. е. его выходное изображение содержит все входные данные), мы можем воссоздать результат вращения вокруг произвольной точки, обрезав этот результат до входного размера с соответствующим смещением.