Это не кажется возможным, и я уверен, что есть простое решение, но я не могу его решить. Матричная математика в моей старшей школе немного заржавела :)
Я создаю CGAffineTransform
, чтобы выполнить перевод-вращение-перевод 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
?
Если я сделаю то же самое, но с CGPoint
вместо CGRect
, похоже, сработает ОК.