CGRectApplyAffineTransform затем CGAffineTransformInvert не возвращается в исходное положение

#ios #objective-c #cgaffinetransform

#iOS #objective-c #cgaffinetransform

Вопрос:

Это кажется невозможным, и я уверен, что есть простое решение, но я не могу его решить. Моя матричная математика в средней школе немного ржавая 🙂

Я создаю a CGAffineTransform для выполнения перевода-поворота-перевода a 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 , кажется, все работает нормально.

Ответ №1:

Скопировано из документации: Вы можете работать со CGRect структурой, вызывая функцию CGRectApplyAffineTransform . Эта функция возвращает наименьший прямоугольник, который содержит преобразованные угловые точки переданного ему прямоугольника. Если аффинное преобразование, которое работает с прямоугольником, выполняет только операции масштабирования и преобразования, возвращаемый прямоугольник совпадает с прямоугольником, построенным из четырех преобразованных углов.

Комментарии:

1. Вы увидите, что я уже обнаружил это решение, но спасибо, что напомнили мне принять его!

Ответ №2: