2

次のコードを与える:

self.transform = CGAffineTransformRotate(self.transform, ?);

現在の回転角がわからなくても、回転を0に戻す方法はありますか?維持したい他の変換があるので、CGAffineTransformRotateの代わりにを使用しているのはなぜですかCGAffineTransformMakeRotation

4

2 に答える 2

3

スケーリングと回転だけの場合、オプションは実際には次のいずれかです。(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);
于 2013-01-17T04:13:08.240 に答える
0

変換を反転することもできます

CGAffineTransform CGAffineTransformInvert (
   CGAffineTransform t
);

例えば

self.transform = CGAffineTransformInvert(CGAffineTransformRotate(self.transform, -angle));
于 2013-01-30T23:09:27.710 に答える