Немного матричной алгебры и тригонометрических тождеств могут помочь вам решить эту проблему.
Мы будем работать над созданием матрицы, которая масштабируется и вращается, а затем используем ее, чтобы выяснить, как аналитически извлечь масштабные коэффициенты и повороты.
Матрица масштабирования для масштабирования по 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