21

回転だけを取得することについて同様の質問を見つけましたが、変換マトリックスではスケーリングと回転が異なることを理解しています。

マトリックスは私の強みではないので、誰かがCGAffineTransform からスケーリングのみを取得する方法を教えてくれたら、私は大いに感謝します。

ところで。CGSize に CGAffineTransform を適用してから、高さ x 幅を取得して、それがどれだけスケーリングされたかを確認しましたが、高さ x 幅には奇妙な値があります (CGAffineTransform で見つかった回転に応じて、...うーん、うまくいきません)

4

7 に答える 7

48

変換がスケーリングとそれに続く回転であると仮定すると (おそらくそこに平行移動がありますが、ゆがみはありません)、水平方向の倍率はsqrt(a^2+c^2)、垂直方向sqrt(b^2+d^2)の倍率は 、水平方向の倍率と垂直方向の倍率の比率は です。a/d = -c/b、ここaで、bc、およびは、ドキュメントごとdに の 6 つのメンバーのうちの 4 つです(およびは、縮尺係数に影響しない変換のみを表します)。CGAffineTransformtxty

|  a  b 0 |
|  c  d 0 |
| tx ty 1 |
于 2010-04-22T15:44:50.533 に答える
34
- (CGFloat)xscale {
    CGAffineTransform t = self.transform;
    return sqrt(t.a * t.a + t.c * t.c);
}

- (CGFloat)yscale {
    CGAffineTransform t = self.transform;
    return sqrt(t.b * t.b + t.d * t.d);
}
于 2013-02-02T16:25:18.230 に答える
10

これは古い質問ですが、誰かが必要な場合に備えて、さらに情報を追加します。

私にとって、スケール、変換の回転、およびそれを再現するための良い答えとサンプルコードは、記事からのものです。

http://www.informit.com/articles/article.aspx?p=1951182

于 2013-01-14T10:19:57.060 に答える
5

私は CGAffineTransform や Objective-C に精通していません (数学タグで私を捕まえました)。一般に、変換を個別にバックアウトする必要があります。たとえば、アフィン変換 A がスケーリング、回転、平行移動のみを実行する場合 (以下の方法では、スケーリングと回転の順序は重要ではありませんが、平行移動は必ず最後にする必要があります):

平行移動:ベクトル (0,0) に A を適用すると、結果 (tx, ty) が返されます。ここで、tx と ty はそれぞれ X 方向と Y 方向の平行移動です。

X のスケーリング:ベクトル (1, 0) に A を適用し、(sx0 + tx, sx1 + ty) を取得します。X のスケーリングは sqrt(sx0^2 + sx1^2) になります。

Y のスケーリング: A をベクトル (0, 1) に適用し、(sy0 + tx, sy1 + ty) を取得します。Y のスケーリングは sqrt(sy0^2 + sy1^2) になります。

アフィン変換は線形変換を使用した単純なトリックによって実装され、線形変換は可換ではないため、個々の変換を引き出す方法を実際に検討する前に、変換がどのように順序付けられているかを理解する必要があります。

于 2010-04-22T15:58:22.523 に答える