有人可以解释UIBezierPath的usesEvenOddFillRule
属性如何工作以及可以在何处使用?
我知道我可能会得到投票,但我真的没有在Apple的文档中得到解释。
答案 0 :(得分:19)
奇偶填充规则是确定路径的哪些区域是"内部"的一种方法。路径vs"外部"路径,这在填充路径内部时很重要。它们通常仅在路径自身切割孔时才会有所不同。偶数规则通常不会遮挡那些区域,而另一种选择通常会遮挡。
奇怪的规则就是这样:
当您在包含路径的画布上沿直线前进时,计算穿过路径的次数。如果你已经越过了奇数次,那么你就是"内部"路径。如果你已经过了偶数次,你就不在路上了。
因此,如果你的路径由两个同心圆形的公牛眼形状组成,那么奇偶规则会认为两个圆圈之间的区域是"内部"并且中心区域为"外部"。
另一种选择称为非零缠绕规则。 (如果usesEvenOddFillRule
为NO
),则使用此选项。非零再次考虑了路径上的直线,但对交叉点进行了不同的计算。它考虑了绘制路径的方向。(即逆时针圆圈与顺时针圆圈不同。)因此:
当您在包含路径的画布上沿直线前进时,请保留一个计数器,从0开始。每次越过路径从左到右进行的路径的一部分(从行中观察)穿过路径),在柜台上加一个。每当你越过一条从右到左的路径行时,从计数器中减去一行。如果计数器非零,则您在路径内。否则,你在外面。
因此,在相同的同心圆示例中,如果两个圆都是在相同方向上绘制的,那么整个区域(中心圆的内部和外部)都将被视为“内部”。路径。如果以相反的方向绘制圆圈,则将考虑中心区域"外部"路径,就像偶数规则一样。
答案 1 :(得分:16)
这里给出了计算机图形填充规则的一个很好的解释。 (这是在.NET参考中,但完全相同的原则适用于Quartz。)
http://msdn.microsoft.com/en-us/library/system.windows.media.fillrule.aspx
简而言之,偶数奇数填充规则意味着每条边都会显示在输出图形中(这可能会导致单个填充路径中包含“洞”),而非零填充规则在大多数情况下会出现,最终意味着绘制的形状大部分都是实体,即使它包含自相交。
下面是一个简单的例子。左图像使用偶数填充规则,右图使用非零填充规则。