Невозможно понять ядро ​​системы преобразования графических координат iOS, нужна помощь - PullRequest
6 голосов
/ 23 февраля 2012

Я пытаюсь понять систему координат кварца 2d, в настоящее время я читаю справочное руководство Apple и старую книгу "Графика кварца 2d для разработчика Mac OS X".

Я понимаю концепцию пространства пользователя и пространства устройства, что пространство устройства может иметь различную систему координат по умолчанию, а координаты пространства устройства не могут быть изменены, и мы отображаем пространство пользователя, изменяя его систему координат, присоединяясь к устройство-пространство для достижения желаемого результата.


  • Первая часть проблемы

Quartz 2d graphics для Mac OS X В книге разработчиков написано:

При преобразовании системы координат, у вас должен быть другой система координат для сравнения. Преобразование обеспечивает относительное отображение из одной системы координат в другую. Когда ты нарисовать в преобразованной системе координат, преобразование отображает рисунок обратно в первую систему координат . Появление этого На графику в фиксированной системе координат влияет преобразование.

Я не получил этот пункт жирным шрифтом.

И

Руководство по программированию кварцевого 2D говорит:

Кварц обеспечивает независимость устройства с помощью отдельной координаты система - пространство пользователя - сопоставление его с системой координат выходных данных устройство - пространство устройства - с использованием текущей матрицы преобразования или CTM. матрица - это математическая конструкция, используемая для эффективного описания множества связанных уравнений. Текущая матрица преобразования конкретный тип матрицы называется аффинным преобразованием, которое отображает указывает из одного координатного пространства в другое, применяя перевод, операции поворота и масштабирования (вычисления, которые перемещаются, вращаются и изменить размер системы координат).

Текущая матрица преобразования имеет вторичное назначение: она позволяет вам преобразовать, как объекты нарисованы. Например, нарисовать коробку повернув на 45 градусов, вы поворачиваете систему координат страницы (CTM), прежде чем нарисовать коробку. Кварц притягивает к выходному устройству используя повернутую систему координат.

Путаница заключается в том, что "Кварц обращается к устройству вывода с использованием повернутой системы координат." У нас целые координаты повернуты, каждая фигура будет повернута?

Я пробую разные эксперименты, но не могу обернуть голову вокруг этого, я создаю изображение, чертя две линии, копируя нижнюю левую систему координат в фотошопе, а затем добавляю в свой проект, чтобы увидеть, как координаты ведут себя, вызывая CGContextRotateCTM(myContext, 45); в методе drawrect, но он ничего не сделал с изображением, которое я включил в xib-файл, используя конструктор интерфейса, помещая изображение в uiimage.

этот код взят из руководства по программированию кварцевых 2D

CGContextRef myContext = UIGraphicsGetCurrentContext();
CGRect contextRect = self.bounds;

CGContextTranslateCTM(myContext, 0, contextRect.size.height);
CGContextRotateCTM(myContext, 45); //my modification
CGContextScaleCTM(myContext, 1, -1);

float w, h;
w = contextRect.size.width;
h = contextRect.size.height;

CGAffineTransform myTextTransform;
CGContextSelectFont (myContext, "Helvetica-Bold", h/10, kCGEncodingMacRoman);
CGContextSetCharacterSpacing (myContext, 10);
CGContextSetTextDrawingMode (myContext, kCGTextFillStroke);

CGContextSetRGBFillColor (myContext, 0, 1, 0, .5);
CGContextSetRGBStrokeColor (myContext, 0, 0, 1, 1);
myTextTransform =  CGAffineTransformMakeRotation(0);
CGContextSetTextMatrix (myContext, myTextTransform);
CGContextShowTextAtPoint (myContext, 0, 50, "Quartz 2D", 9);

но этот код изменяет текст, нарисованный на экране, а не изображение, которое я добавил?


  • Вторая часть проблемы

Это также из руководства по программированию Quartz 2D:

... применить преобразование, которое переводит начало координат в верхний левый угол контекста PDF и масштабирует координату y на -1.

Использование масштабного преобразования для отрицания y-координаты изменяет некоторые условности в Кварцевом рисунке. Например, если вы звоните CGContextDrawImage, чтобы нарисовать изображение в контексте, изображение изменено преобразованием, когда оно обращается в пункт назначения. ...

Я уже делаю это с -1, но это никак не влияет на изображение, и это с -1 все еще мне не понятно.

Я несколько раз читал этот документ, пытался выполнить поиск в Google, но нет полезного учебника, а также нет последних доступных книг, только книги, написанные в 2004, 2005, 2006 годах. Может ли кто-нибудь помочь с этим или может дать мне полезные ресурсы для изучения это в глубину.

Deотчаянно жду ответов, очень нужна помощь.Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Прочтите это руководство, и я надеюсь, что все ваши проблемы будут ясны

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Transforms/Transforms.html

0 голосов
/ 23 февраля 2012

Используете ли вы подкласс UIImageView и переопределяете drawRect?Это не поддерживается (см. Документацию) и, вероятно, поэтому ваше изображение не подвержено никаким преобразованиям.

Если вы хотите сделать много преобразований и сделать код для рисования, вам следует использовать подкласс UIView и рисовать ваше изображение вручную с помощью CGContextDrawImage ()

Любые преобразования применяются для выполненных операций рисованияпосле преобразования.Вы увидите примеры кода в документах, где сохранено графическое состояние, применено преобразование, выполнено некоторое рисование, а затем восстановлен контекст.Вот как вы рисуете, некоторые компоненты повернуты, а некоторые нет.

Надеюсь, вторая часть вашего вопроса станет понятной, как только вы начнете рисовать свое изображение с помощью кода CG, а не с помощью вида изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...