Трансформация, которую вы предлагаете, не аффинна. Аффинные преобразования должны быть отменены. Так они обычно могут:
- Масштаб
- Поворот
- Сдвиг (сделать изогнутым, как квадрат -> параллелограмм)
- Перевести
Но они не могут "сжать". Обратите внимание, что левая и правая стороны вашей трапеции, если они расширены, будут пересекаться в определенном месте. Они больше не параллельны. Таким образом, вы не можете «отменить» преобразование, потому что если в этом месте есть что-то, что нужно преобразовать, вы не сможете решить, куда они будут преобразовываться. Другими словами, если преобразование не сохраняет параллелизм, оно сжимает пространство, не может быть отменено и не является аффинным.
Я не так много знаю о преобразованиях в Core Animation, поэтому я надеюсь, что математические вещи помогут вам найти альтернативу.
Но я знаю, как вы могли бы сделать это в OpenGL, но для этого нужно начать с того, как вы рисуете свое приложение:
Если я правильно представляю результат, который вы хотите, вы хотите построить прямоугольник в 3D, использовать аффинное преобразование, чтобы немного повернуть его, и использовать (неаффинное) преобразование проекции, чтобы сгладить это в 2D-изображение.
Если вы не ищете 3D-эффект, но на самом деле просто хотите ущипнуть углы, тогда вы можете указать GL_RECT
с точками трапеции и отобразить на нем свой спрайт как текстура.
Самым простым может быть предварительное сжатие изображения в редакторе фотографий, сохранение его в формате .png с прозрачностью и рисование прямоугольника с этим изображением.