平行移動とスケーリングの値を持つ CGAffineTransform から回転角度だけを取得することは可能ですか? はいの場合、どのように?
前もって感謝します!
平行移動とスケーリングの値を持つ CGAffineTransform から回転角度だけを取得することは可能ですか? はいの場合、どのように?
前もって感謝します!
atan2(rotationTransform.b, rotationTransform.d)
誰かが提案した acos(b) ソリューションは、+/-0.5pi の範囲でのみ有効です。このソリューションは、回転、平行移動、およびスケーリングの組み合わせの下で堅牢に見えますが、ほぼ確実にせん断ではありません。私の以前の回答 ( atan2(rotationTransform.b, rotationTransform.a
) は、スケーリングに対して堅牢ではありませんでした。
アフィンメンバー b または c の asin() または acos() を取ります。
struct CGAffineTransform {
CGFloat a;
CGFloat b;
CGFloat c;
CGFloat d;
CGFloat tx;
CGFloat ty;
};
私は過去に、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コードをそのままコピーできます。)
acos () および asin() 関数を使用して、CGAffineTransformMakeRotationが行うことを逆にすることができます。ただし、スケール変換行列が乗算されているため、これを行うのは少し難しい場合があります。