Скос контура/формы в базовой графике

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

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

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

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

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

Обновление

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

7
задан Aaron Hayman 29 May 2012 в 20:38
поделиться