点の周りに角度αの回転(x、y)はアフィン変換に対応する:
CGAffineTransform transform = CGAffineTransformMake(cos(a),sin(a),-sin(a),cos(a),x-x*cos(a)+y*sin(a),y-x*sin(a)-y*cos(a));
代わりに使用すると、回転するかどうかに応じての-aをプラグインする必要があるかもしれません時計回りまたは反時計回り。また、座標系が上下逆になっているかどうかによって、yの代わりに-yを差し込む必要があります。ビューにこれを適用した場合、あなたはまた、単に(A)CGAffineTransformMakeRotationを経由して変換の回転を使用することができます
CGAffineTransform transform = CGAffineTransformMakeTranslation(x, y);
transform = CGAffineTransformRotate(transform, a);
transform = CGAffineTransformTranslate(transform,-x,-y);
を、:
また、あなたが使用して3行のコードで正確に同じことを達成することができますビューのレイヤーのanchorPointプロパティを設定して、回転させたいポイントを反映させる必要があります。しかし、これをビューに適用することに興味がないような音です。
最後に、これを非ユークリッドの2D空間に適用する場合、アファイン変換はまったく必要ないかもしれません。アフィン変換は、ユークリッド空間の等尺性であり、標準的なユークリッド距離と角度を保存することを意味します。あなたの空間がユークリッドでないなら、あなたが望む変換は実際にはアファインではないかもしれません。アファインであれば、ローテーションの行列は、私がsinとcosで上に書いたものほど単純ではないかもしれません。たとえば、双曲線の空間にいた場合は、双曲線三角関数sinhとcoshと、式の異なる+と - の記号を使用する必要があります。
P.S.私はまた、「アフィーネ」が「有能」のような長い「a」ではなく「ask」のような短い「a」で発音されることを、これまでに読んだ人に思い出させたい。 Appleの社員がWWDCの会合でそれを誤って発音していると聞いています。
を?積み重ねられた呼び出しは、読み込み可能で意味がある方法を除いて、まったく同じ結果を生成します。あなたが本当に一回の呼び出しでそれをしたいのであれば、スタックされた呼び出しで使用されたのと同じ数学を複製することになります。 –
どのような要件がありますか? CGAffineTransformConcatを使用して、これらの「積み重ねた」変換を1つのCGAffineTransformに組み合わせることができます。結果は個々のコンポーネントの数式と同じになり、関係する計算は内部的に同じになります。あるいはCGAffineTransformConcatの場合にはさらに最適化されます。 – morningstar
私は行列方程式が、異なる(必ずしもユークリッドではない)幾何学的2D空間で一致するが非グラフィックスモデルオブジェクトに使用されることを望む。 – hotpaw2