Можно ли получить только угол поворота из CGAffineTransform, который также имеет значения перемещения и масштабирования? Если да, то как?
Заранее спасибо!
Можно ли получить только угол поворота из CGAffineTransform, который также имеет значения перемещения и масштабирования? Если да, то как?
Заранее спасибо!
Возьмите asin () или acos () аффинного члена b или c.
struct CGAffineTransform {
CGFloat a;
CGFloat b;
CGFloat c;
CGFloat d;
CGFloat tx;
CGFloat ty;
};
atan2(rotationTransform.b, rotationTransform.d)
Предложенное кем-то решение acos (b) действительно только в диапазоне +/- 0,5pi. Это решение кажется надежным в сочетании с вращением, перемещением и масштабированием, хотя почти наверняка не сдвигает. Мой предыдущий ответ (atan2(rotationTransform.b, rotationTransform.a
) не был устойчивым к масштабированию.
Этот дубликат был основой моего первоначального ответа < / а>.
atan2(rotationTransform.b, rotationTransform.d)
- person Gary Lyn; 10.01.2015
Вы можете попробовать использовать функции acos () и asin (), чтобы отменить то, что CGAffineTransformMakeRotation делает. Однако, поскольку у вас есть матрица преобразования масштаба, умноженная на нее, это может быть немного сложно сделать.
В прошлом я использовал класс 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 как есть.)
asin и acos неверны, когда есть масштаб.
правильная формула:
CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a);
CGFloat degrees = radians * (180 / M_PI);
or:
CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];