Наклонение контура / фигуры в Core Graphics - PullRequest
7 голосов
/ 19 марта 2012

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

Я включил мою реализацию ниже. Я использую три переменные для определения скоса: CGFloat bevelSize, UIColor highlightColor, UIColor shadow. Обратите внимание, что угол источника света всегда составляет 135 градусов. Я еще не закончил реализацию этого, но вот по сути то, что я пытаюсь сделать, разделить на две части. Часть первая, сгенерируйте фокусы:

  1. Я нахожу биссектрисы для углов между каждой смежной линией на пути.
  2. Для дуг биссектриса - это линия, перпендикулярная линии, созданной двумя конечными точками дуги, исходящей из средней точки. Это должно позаботиться о большинстве ситуаций, в которых используется дуга. Я не беру биссектрису дуги и линии. В этих случаях дуга должна работать нормально.
  3. Затем я вычисляю фокусы на основе пересечения каждой смежной биссектрисы.
  4. Если фокус находится в пределах используемой формы, в противном случае он отбрасывается.

Целью создания фокусных точек является пропорциональное сокращение формы.

Вторая часть немного сложнее. Я существенно создаю каждую сторону / сегмент скошенной формы. Я делаю это, рисуя 'in' (bevelSize) каждую точку исходной фигуры вдоль радиуса линии, которая простирается от ближайшей фокусной точки до рассматриваемой точки. Когда у меня есть два последовательных «bevelPoints», я создаю UIBezierPath, который простирается от bevelPoints до исходных точек и обратно до bevelPoints (обратите внимание, это включает в себя дуги). Это создает «сторону / сегмент», который я могу использовать для заполнения. На прямых сторонах я просто заполняю либо цветом тени, либо цветом подсветки, в зависимости от угла стороны. Для дуг я определяю радиан «дуга». Если эта дуга содержит угол перехода (M_PI_4 или M_PI + M_PI_4), я заполняю ее градиентом (от тени до подсветки или от подсветки до тени, что всегда уместно). В противном случае я заливаю его сплошным цветом.

Обновление

Я разделил свой ответ (см. Ниже) на отдельный пост в блоге. Я больше не использую детали реализации, которые вы видите выше, но держу все это там для справки. Я надеюсь, что это поможет всем, кто хочет использовать Core Graphics.

1 Ответ

3 голосов
/ 30 мая 2012

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

UPDATE

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

Я объясняю код и процесс, которые я использовал для наклона, здесь: Наклонение фигур в основной графике

Вот код: Github: CGPathBevel .

Код не идеален: я открыт для предложений / исправлений / лучших способов ведения дел.

...