Вращение угла a вокруг точки (x, y) соответствует аффинному преобразованию:
CGAffineTransform transform = CGAffineTransformMake(cos(a),sin(a),-sin(a),cos(a),x-x*cos(a)+y*sin(a),y-x*sin(a)-y*cos(a));
Возможно, вам потребуется подключить -a вместо зависимости от того, хотите ли вы вращениебыть по часовой стрелке или против часовой стрелки.Кроме того, вам может понадобиться подключить -y вместо y в зависимости от того, перевернута ли ваша система координат.
Кроме того, вы можете выполнить одно и то же в трех строках кода, используя:
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, a);
transform = CGAffineTransformTranslate(transform,-x,-y);
Если вы применяете это к представлению, вы также можете просто использовать преобразование вращения через CGAffineTransformMakeRotation (a), при условии, что вы установили свойство anchorPoint слоя представления, чтобы отразить точку, вокруг которой вы хотите повернуть.Однако звучит так, будто вы не заинтересованы в применении этого к представлению.
Наконец, если вы применяете это к неевклидову 2D-пространству, вы можете вообще не захотеть аффинное преобразование.Аффинные преобразования - это изометрии евклидова пространства, что означает, что они сохраняют стандартное евклидово расстояние, а также углы.Если ваше пространство не является евклидовым, то преобразование, которое вы хотите, может на самом деле не быть аффинным, или если оно аффинно, матрица для вращения может быть не такой простой, как то, что я написал выше с помощью sin и cos.Например, если вы находитесь в гиперболическом пространстве, вам может потребоваться использовать гиперболические тригонометрические функции sinh и cosh, а также различные знаки + и - в формуле.
PS Я также хотел бы напомнить любому, кто читает этодалеко, что «аффинность» произносится с коротким «а», как в «спросить», а не с длинным «а», как в «состоянии».Я даже слышал, как сотрудники Apple неправильно произносили это в своих выступлениях на WWDC.