Подтвердить что ты не робот

Как работает useEvenOddFillRule?

Может ли кто-нибудь объяснить, как работает свойство usesEvenOddFillRule UIBezierPath и где его можно использовать?

Я знаю, что могу получить пропуски для голосования, но я действительно не получил объяснения в документах Apple.

4b9b3361

Ответ 1

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

Четно-нечетное правило просто следующее:

По мере продвижения по прямой по холсту, содержащему путь, подсчитайте количество переходов по пути. Если вы пересекли нечетное число раз, вы "внутри" пути. Если вы пересекли четное число раз, вы находитесь за пределами пути.

Таким образом, если ваш путь состоит из двух концентрических кругов в форме быка, четное правило будет рассматривать область между двумя кругами как "внутри", а площадь в центре "снаружи".

Другая опция называется правилом ненулевой обмотки. (Это используется, если usesEvenOddFillRule - NO). Опять-таки ненулевая линия рассматривает прямую линию по пути, но несколько пересекает пересечения. Он учитывает направление, в котором был проложен путь (т.е. Круг против часовой стрелки не совпадает с кругом по часовой стрелке). Таким образом:

По мере того, как вы продвигаетесь по прямой линии на холсте, содержащем путь, держите счетчик, начиная с 0. Каждый раз, когда вы пересекаете часть пути, по которой путь продвигается слева направо (как видно из строки пересекая путь), добавьте один к счетчику. Каждый раз, когда вы пересекаете линию, где путь проходит справа от вас, вычитайте один из счетчика. Если счетчик не равен нулю, вы находитесь внутри пути. В противном случае вы находитесь снаружи.

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

Ответ 2

Здесь дается хорошее объяснение правил заполнения в компьютерной графике. (Это в .NET-ссылке, но те же самые принципы применимы к Quartz.)

http://msdn.microsoft.com/en-us/library/system.windows.media.fillrule.aspx

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

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

an example of fill rules