次のコードを与える:
self.transform = CGAffineTransformRotate(self.transform, ?);
現在の回転角がわからなくても、回転を0に戻す方法はありますか?維持したい他の変換があるので、CGAffineTransformRotate
の代わりにを使用しているのはなぜですかCGAffineTransformMakeRotation
。
次のコードを与える:
self.transform = CGAffineTransformRotate(self.transform, ?);
現在の回転角がわからなくても、回転を0に戻す方法はありますか?維持したい他の変換があるので、CGAffineTransformRotate
の代わりにを使用しているのはなぜですかCGAffineTransformMakeRotation
。
スケーリングと回転だけの場合、オプションは実際には次のいずれかです。(i)スケールだけを決定し、そのスケールのまったく新しいスケーリングマトリックスを作成します。または(ii)提案したように、回転を決定し、反対の量で変換を調整します。
変換行列のコンポーネントを調べることで、どちらかを達成できます。行列の乗算がどのように機能するかを考えると、出力x軸がで(transform.a, transform.b)
あり、出力y軸がであることがわかります(transform.c, transform.d)
。
したがって、(i)の場合:
// use the Pythagorean theorem to get the length of either axis;
// that's the scale, e.g.
CGFloat scale = sqrtf(
self.transform.a*self.transform.a +
self.transform.b*self.transform.b);
self.transform = CGAffineTransformMakeScale(scale, scale);
(ii)の場合:
// use arctan to get the rotation of the x axis
CGFloat angle = atan2f(
self.transform.b*self.transform.b, self.transform.b*self.transform.a);
self.transform = CGAffineTransformRotate(self.transform, -angle);
変換を反転することもできます
CGAffineTransform CGAffineTransformInvert (
CGAffineTransform t
);
例えば
self.transform = CGAffineTransformInvert(CGAffineTransformRotate(self.transform, -angle));