Нахождение направления / направления намотки CGPath - PullRequest
1 голос
/ 26 марта 2012

При рендеринге перекрывающихся CGPath Apple использует правило намотки, чтобы решить, следует ли отображать оба из них как сплошные, или использовать одно из них, чтобы вырезать часть другого.

Я хочу, чтобы все мои CGPath были сплошными, но я не могу сказать пользователям «рисовать их так или иначе», поэтому мне нужно определить, когда направление намотки противоположно нормальному, и затем повернуть его вспять.

Я знаю, как обратить все элементы пути с помощью CGPathApply (хотя это много стандартного кода) - но как вы получаете доступ к направлению намотки CGPath? Разве Apple уже не рассчитала это (так как они используют это внутренне)?

В худшем случае, я также заново внедрю колесо и сделаю еще один CGPathApply, который вычисляет обмотку - но это кажется чрезмерно типичным / подверженным ошибкам, поэтому, если есть источник Apple для этой информации ...

Ответы [ 2 ]

0 голосов
/ 10 апреля 2012

В конце концов, я написал свой.Псевдокод:

  1. использовать CGPathApplier для запуска пользовательской функции
  2. преобразовать каждый узел в пользовательский объект (так как API Apple не-OOP)
  3. итерация по всем узлами, если вы найдете CLOSE, который не является последним узлом, разделите (у вас есть несколько подпутей) и перезапустите алгоритм с каждым подпутем
  4. итерации по всем узлам, выберите точку на полпути вдоль каждой линии-сегмент, а затем шаг 1 пиксель влево, один пиксель вправо (где «влево / вправо» означает «перпендикулярно направлению линии»
  5. спросить у Apple «находится (пиксель влево) внутри пути?«
  6. то же пиксель вправо
  7. , если все находятся слева = наматывание
  8. , если все вправо = намотка b
  9. , если смесь слева /право = предупредить пользователя, что его форма пересекает себя, и все будет странно и неправильно
0 голосов
/ 26 марта 2012

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

Во всяком случае, на самом деле не существует фундаментального "направления извилистости" пути.Правило заполнения всегда оценивает обмотку в точке .

Представьте путь в виде восьмерки, где один лепесток движется по часовой стрелке, а другой - против часовой стрелки.Намотка в точке внутри одного лепестка отличается от намотки в другом лепестке.

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

...