Трансформации CTM против аффинных преобразований в iOS (для перевода, поворота, масштабирования)

Я прочитал документацию Transforms в Руководстве по 2D-программированию кварца. В этом случае существует два способа сделать преобразования. Одним из способов является изменение Матрицы трансформации тока (CTM). Он имеет следующие методы:

  • CGContextTranslateCTM
  • CGContextRotateCTM
  • CGContextScaleCTM

Другим способом является использование аффинных преобразований. Он имеет следующие методы:

  • CGAffineTransformTranslate
  • CGAffineTransformRotate
  • CGAffineTransformScale

Состояние документов

Функции аффинного преобразования, доступные в кварце, работают на матрицах, а не на CTM.

Но я не понимаю, как это влияет на меня практически. Кажется, я могу получить тот же результат, используя любой метод. Когда следует использовать трансформации CTM и когда следует использовать аффинные преобразования?

Ответ 1

CTM - это текущая матрица преобразования, и методы CTM будут выполнять операции с текущей матрицей.

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

Например, эти 2 операции будут одинаковыми:

CGContextTranslateCTM(context, 10, 10);

аффинных:

CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, 10, 10);
CGContextConcatCTM(context, transform);

Как вы видите, первый из них более или менее удобен, поэтому вам не нужно писать столько кода.