CGAffineTransform: как применить шкалу к переводу?

Аффинные преобразования, используемые Apple, имеют «масштаб», определенный как «не влияет на перевод».

Это кажется мне совершенно неправильным и не соответствует тому, что я ожидаю от обычных аффинных преобразований (где масштаб, умноженный на перевод, ДЕЙСТВИТЕЛЬНО влияет на перевод), и чрезвычайно затрудняет работу с реальными проблемами, где " масштабирование», как ожидается, будет масштабировать всю систему координат, а не только локальные координаты одного объекта за раз.

Есть ли в библиотеке Apple безопасный способ обойти эту проблему (например, применить «масштаб» ко всей матрице, а не только к частям, не связанным с переводом)?

Или я сделал глупую ошибку и совершенно неправильно понял, что происходит с масштабированием?


person Adam    schedule 28.05.2012    source источник


Ответы (2)


Я почти уверен, что это просто означает, что это не влияет на значения перевода в матрице. CGAffineTransform — это не какая-то особая разновидность математики, это просто обычная матрица преобразования. Она работает как любая другая матрица преобразования, которую вы когда-либо использовали.

person Lily Ballard    schedule 28.05.2012
comment
Спасибо. Ваш комментарий заставил меня поближе взглянуть на фактические умножения и, следовательно, заметил мою ошибку в аргументах concat. - person Adam; 29.05.2012

Ах. Смущающий. Моя ошибка: аргументы для concat были неправильными! По крайней мере, я могу оставить это здесь и, надеюсь, помочь следующему человеку совершить такую ​​глупую ошибку.

  1. У меня был вызов Concat с аргументами неправильно; очевидно, "перевод" "масштаба" работает так, как ожидалось - масштаб не влияет на перевод!

  2. Когда я погуглил эту проблему, я наткнулся на пару страниц, где говорилось о том, что CGAffineTransform выполняет независимое масштабирование и перевод. Предвзятость подтверждения :( Я прочитал это и предположил, что это правда. Дох.

К вашему сведению: CGAffineTransformConcat( A, B )... делает: Matrix A * Matrix B... т.е. "сначала эффекты A, затем эффекты B"

Итак, убедитесь, что ваша матрица масштабирования является вторым аргументом (или аргументом «позже», если у вас есть цепочка вложенных вызовов Concat).

person Adam    schedule 28.05.2012