Получить только поворот из CGAffineTransform - PullRequest
6 голосов
/ 01 октября 2009

Можно ли получить только угол поворота от CGAffineTransform, который также имеет значения перемещения и масштабирования? Если да, то как?

Заранее спасибо!

Ответы [ 5 ]

5 голосов
/ 16 января 2014
atan2(rotationTransform.b, rotationTransform.d)

Предлагаемое кем-то решение acos (b) действительно только в диапазоне +/- 0.5pi. Это решение кажется надежным при комбинациях вращения, перемещения и масштабирования, хотя почти наверняка не сдвиг. Мой предыдущий ответ (atan2(rotationTransform.b, rotationTransform.a) не был надежным для масштабирования.

Этот дубликат послужил основой для моего первоначального ответа .

5 голосов
/ 01 октября 2009

Взять asin () или acos () аффинного члена b или c.

struct CGAffineTransform {
   CGFloat a;
   CGFloat b;
   CGFloat c;
   CGFloat d;
   CGFloat tx;
   CGFloat ty;
};
0 голосов
/ 25 февраля 2014

asin и acos не правильно, когда есть масштаб.

правильная формула:

CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a); 
CGFloat degrees = radians * (180 / M_PI); 

или

CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
0 голосов
/ 01 октября 2009

В прошлом я использовал класс XAffineTransform из набора инструментов GeoTools для извлечения вращения из аффинной матрицы. Это работает, даже когда масштабирование и сдвиг были применены.

Это библиотека Java, но вы должны легко конвертировать ее в (Objective-) C. Вы можете посмотреть источник для XAffineTransform здесь . (Метод называется getRotation.) И вы можете прочитать API здесь .

В этом суть метода:

final double scaleX = getScaleX0(tr);
final double scaleY = getScaleY0(tr) * flip;
return Math.atan2(tr.getShearY()/scaleY - tr.getShearX()/scaleX,
                  tr.getScaleY()/scaleY + tr.getScaleX()/scaleX);

Вам также необходимо реализовать методы getScale / getShear. Совсем не сложно. (По большей части вы можете просто скопировать код Java как есть.)

0 голосов
/ 01 октября 2009

Вы можете попробовать использовать функции acos () и asin (), чтобы полностью изменить то, что делает CGAffineTransformMakeRotation . Однако, так как у вас там умножена матрица преобразования Scale, это может быть немного сложно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...