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