CGAffineTransform Перевод и вращение дают необоснованный результат преобразования
Для данного расчета преобразования,
CGAffineTransform preferredTransform = CGAffineTransformMake(-1, 0, 0, -1, 1920, 1080);
CGAffineTransform transform1 = CGAffineTransformConcat(CGAffineTransformMakeTranslation(-preferredTransform.tx, -preferredTransform.ty), CGAffineTransformMakeRotation(M_PI));
NSLog(@"%@", NSStringFromCGAffineTransform(transform1));
Выход будет [-1, 1.2246467991473532e-16, -1.2246467991473532e-16, -1, 1920.0000000000002, 1079.9999999999998]
все же я бы ожидал, что это будет [-1, 0, 0, -1, 1920, 1080]
Почему ошибки округления? Должен ли я применять преобразования по-разному, чтобы получить округленные результаты?
2 ответа
Решение
На 32-битном iPad округление выполняется правильно, однако на 64-битном iPad происходит ошибка округления. Поскольку поворот по M_PI аналогичен масштабированию по -1, это можно легко исправить, изменив его на:
CGAffineTransform preferredTransform = CGAffineTransformMake(-1, 0, 0, -1, 1920, 1080);
CGAffineTransform transform1 = CGAffineTransformConcat(CGAffineTransformMakeTranslation(-preferredTransform.tx, -preferredTransform.ty), **CGAffineTransformMakeScale(-1, -1)**);
NSLog(@"%@", NSStringFromCGAffineTransform(transform1));
Указанные ошибки округления обусловлены 64-битной архитектурой. Если вы запускаете на 32-битном симуляторе, вы не должны видеть этих ошибок округления.