6

平行移動とスケーリングの値を持つ CGAffineTransform から回転角度だけを取得することは可能ですか? はいの場合、どのように?

前もって感謝します!

4

5 に答える 5

6
atan2(rotationTransform.b, rotationTransform.d)

誰かが提案した acos(b) ソリューションは、+/-0.5pi の範囲でのみ有効です。このソリューションは、回転、平行移動、およびスケーリングの組み合わせの下で堅牢に見えますが、ほぼ確実にせん断ではありません。私の以前の回答 ( atan2(rotationTransform.b, rotationTransform.a) は、スケーリングに対して堅牢ではありませんでした。

この複製は、私の元の回答の基礎でした

于 2014-01-16T15:42:08.583 に答える
5

アフィンメンバー b または c の asin() または acos() を取ります。

struct CGAffineTransform {
   CGFloat a;
   CGFloat b;
   CGFloat c;
   CGFloat d;
   CGFloat tx;
   CGFloat ty;
};
于 2009-10-01T15:22:25.223 に答える
0

私は過去に、GeoToolsツールキットのXAffineTransformクラスを使用して、アフィン行列から回転を抽出しました。スケーリングとせん断が適用されている場合でも機能します。

これは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コードをそのままコピーできます。)

于 2009-10-01T16:05:25.357 に答える
0

acos () および asin() 関数を使用して、CGAffineTransformMakeRotationが行うことを逆にすることができます。ただし、スケール変換行列が乗算されているため、これを行うのは少し難しい場合があります。

于 2009-10-01T15:01:36.860 に答える