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-битном симуляторе, вы не должны видеть этих ошибок округления.

Другие вопросы по тегам