получение поворота и размера UIImageView на основе его матриц преобразования

Если у меня есть исходная матрица преобразования прямоугольного UIImageView, и это изображение масштабируется и поворачивается, и к концу я могу прочитать окончательную матрицу преобразования того же представления, как я могу рассчитать, насколько масштабировано и повернуто изображение?

Я предполагаю, что каким-то образом эти матрицы содержат эти две информации. Проблема в том, как его извлечь...

любые подсказки?

спасибо за любую помощь.


person Duck    schedule 04.09.2009    source источник


Ответы (1)


Немного матричной алгебры и тригонометрических тождеств могут помочь вам решить эту проблему.

Мы будем работать над созданием матрицы, которая масштабируется и вращается, а затем используем ее, чтобы выяснить, как аналитически извлечь масштабные коэффициенты и повороты.

Матрица масштабирования для масштабирования по Sx (по оси X) и Sy (по оси Y) выглядит следующим образом:

⎡Sx  0 ⎤
⎣0   Sy⎦

Матрица для поворота по часовой стрелке на R радиан выглядит так:

⎡cos(R)   sin(R)⎤
⎣-sin(R)  cos(R)⎦

Используя стандартное матричное умножение, комбинированная матрица масштабирования и поворота будет выглядеть так:

⎡Sx.cos(R)   Sx.sin(R)⎤
⎣-Sy.sin(R)  Sy.cos(R)⎦

Обратите внимание, что линейные преобразования могут также включать сдвиг или другие преобразования, но для этого вопроса я предполагаю, что имели место только вращение и масштабирование (если преобразование сдвига находится в матрице, вы получите противоречивые результаты, следуя алгебре здесь; но тот же подход можно использовать для определения аналитического решения).

CGAffineTransform имеет четыре члена a, b, c, d, соответствующие двумерной матрице:

⎡a  b⎤
⎣c  d⎦

Теперь мы хотим извлечь из этой матрицы значения Sx, Sy и R. Здесь мы можем использовать простое тригонометрическое тождество:

tan(A) = sin(A) / cos(A)

Мы можем использовать это с первой строкой матрицы, чтобы сделать вывод, что:

tan(R) = Sx.sin(R) / Sx.cos(R) = b / a    and therefore    R = atan(b / a)

И теперь, когда мы знаем R, мы можем извлечь коэффициенты масштабирования, используя главную диагональ:

a = Sx.cos(R)    and therefore    Sx = a / cos(R)
d = Sy.cos(R)    and therefore    Sy = d / cos(R)

Итак, теперь вы знаете Sx, Sy и R.

person adurdin    schedule 08.09.2009
comment
Похоже, шкала может быть отрицательной. Я бы рекомендовал взять абсолютное значение Sx и Sy. - person Paul Solt; 05.04.2011
comment
Отрицательная шкала вполне допустима; он инвертирует ось. Sx = -1 будет означать, что изображение было перевернуто по горизонтали. - person adurdin; 15.04.2011