CGAffineTransformから回転角度を取得することは可能ですか?変換とスケーリングの値もありますか?はいの場合、どうですか?CGAffineTransformからローテーションだけを取得
ありがとうございます!
CGAffineTransformから回転角度を取得することは可能ですか?変換とスケーリングの値もありますか?はいの場合、どうですか?CGAffineTransformからローテーションだけを取得
ありがとうございます!
アフィンメンバーbまたはcのasin()またはacos()を取得します。私が過去に有していて
struct CGAffineTransform {
CGFloat a;
CGFloat b;
CGFloat c;
CGFloat d;
CGFloat tx;
CGFloat ty;
};
acos()およびasin()関数を使用して、CGAffineTransformMakeRotationの処理を取り消すことができます。しかし、Scale変換行列が乗算されているので、それを行うのは少し難しいかもしれません。
はアフィン行列から回転を抽出するGeoToolsツールキットからXAffineTransformクラスを使用します。スケーリングとせん断が適用されても機能します。
これはJavaライブラリですが、簡単に(Objective-)Cに変換できるはずです。 the source for XAffineTransform hereを見ることができます。 (メソッドはgetRotationと呼ばれます)。そして、あなたはread the API hereです。
これは、メソッドの心臓部です:
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コードをコピーすることができます。)
atan2(rotationTransform.b, rotationTransform.d)
ACOS(b)は誰かによって提案されたソリューションは、範囲+/- 0.5piでのみ有効です。この解決法は、ほとんど確実にせん断せず、回転、平行移動、スケーリングの組み合わせの下では強固に見えます。私の以前の答え(atan2(rotationTransform.b, rotationTransform.a
)はスケーリングに対して堅牢ではありませんでした。
私はそれが 'atan2(rotationTransform.b、rotationTransform.d)' –
Luizであるべきだと思います - 翻訳と回転の組み合わせの下ではどちらも同じで正しいですが、スケーリングが追加されたときにあなたも正しいと思われますそれを更新する。ありがとうございました。 –
transform.bを使用して、transform.dが保存されました!ありがとう! – srik
asinとスケールがあるときはacosが正しくありません。
正しい式は次のとおりです。
CGFloat radians = atan2f(self.view.transform.b, self.view.transform.a);
CGFloat degrees = radians * (180/M_PI);
か:
CGFloat angle = [(NSNumber *)[view valueForKeyPath:@"layer.transform.rotation.z"] floatValue];
この背後にある数学はクォーツ2Dプログラミングガイドのサブセクション "行列の後ろの数学" で説明されています。http://スケールがある場合はdeveloper.apple.com/mac/library/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_affine/dq_affine.html#//apple_ref/doc/uid/TP30001066-CH204-CJBECIAD –
asinとacosが正しくありません。正しい式は次のとおりです。 CGFloat radians = atan2f(self.view.transform.b、self.view.transform.a); CGFloat degrees =ラジアン*(180/M_PI); – lbsweek