5

これは不可能と思われ、簡単な解決策があると確信していますが、解決できません。私の高校の行列数学は少しさびています:)

CGAffineTransformのtranslation-rotation-translationを実行するために を構築してからCGRect、逆CGAffineTransformInvertを使用して元の場所に戻ろうとしています。しかし、そうではありません。私はそれをこれに減らすことができました:

//  start building the transform...
//  translate so (0,0) is at centre of image
CGAffineTransform affine = CGAffineTransformMakeTranslation(-100, -100);

//  add a rotate
affine = CGAffineTransformConcat(affine, CGAffineTransformMakeRotation(M_PI/4));

//  get the inverse
CGAffineTransform inverseAffine = CGAffineTransformInvert(affine);

//  now test this: pick a starting CGRect
CGRect start = CGRectMake(50, 40, 10, 20);

// use my CGAffineTransform to move "start" to "midpoint"
CGRect midpoint = CGRectApplyAffineTransform(start, affine);

//  use the inverse to move "midpoint" to "finish"
CGRect finish = CGRectApplyAffineTransform(midpoint, inverseAffine);

//  what did we get
NSLog(@"start    %5.1f %5.1f %5.1f %5.1f", start.origin.x, start.origin.y, start.size.width, start.size.height);
NSLog(@"midpoint %5.1f %5.1f %5.1f %5.1f", midpoint.origin.x, midpoint.origin.y, midpoint.size.width, midpoint.size.height);
NSLog(@"finish   %5.1f %5.1f %5.1f %5.1f", finish.origin.x, finish.origin.y, finish.size.width, finish.size.height);

出力は次のようになります。

2011-09-29 ... start     50.0  40.0  10.0  20.0
2011-09-29 ... midpoint  -7.1 -77.8  21.2  21.2
2011-09-29 ... finish    40.0  35.0  30.0  30.0

終了矩形は開始と同じであるべきではありませんか? それがすべきことCGAffineTransformInvertではないでしょうか。

同じことを a のCGPoint代わりに a を使用すると、問題なくCGRect動作するようです。

4

2 に答える 2

7

ドキュメントからのコピー: 関数を呼び出すことで、構造体を操作できます。この関数は、渡された四角形の変換されたコーナー ポイントを含む最小の四角形を返します。四角形を操作するアフィン変換がスケーリング操作と平行移動操作のみを実行する場合、返される四角形は、変換された 4 つの角から構成される四角形と一致します。CGRectCGRectApplyAffineTransform

于 2012-02-20T13:35:42.297 に答える
6

OK私は間違いを見つけました。

アフィン変換は一般に長方形を保持しないため、関数CGRectApplyAffineTransformは、rectパラメーターの変換されたコーナーポイントを含む最小の長方形を返します。

奇妙なねじれた非CGRectっぽいものではありません。

于 2011-09-29T02:34:10.587 に答える