usesEvenOddFillRule是如何工作的?

21

有人能解释一下 usesEvenOddFillRule 属性在 UIBezierPath 中是如何工作的以及它可以在哪里使用吗?

我知道可能会得到负分,但我真的没有理解苹果文档中的解释。


2
“奇偶填充规则”和“非零填充规则”是计算机图形学中已知的概念。它们很容易被搜索到。 - millimoose
@millimoose 感谢您的评论,但如果您能提供任何有关该信息的链接,那将是非常好的。 - Developer
4
哎,我就是讨厌别人说“去搜索一下”。SO的目的是提问-不仅仅是那些可以查找到答案的问题。要么帮忙,要么离开。无论如何,很高兴这个问题在这里-我发现它很有用! :-) - colinta
2个回答

24
偶奇填充规则是一种确定路径中哪些区域是“内部”和“外部”的方法,这在填充路径的内部时非常重要。当路径自身切割出孔时,它们通常只有细微不同。偶数-奇数规则通常不会对这些区域进行着色,而另一种选项通常会。
偶数-奇数规则就是这样:沿着包含路径的画布以直线前进,计算穿过路径的次数。如果穿过了奇数次,则在路径内部。如果穿过了偶数次,则在路径外部。
因此,如果您的路径由两个同心圆组成,呈靶眼状,那么偶数-奇数规则将认为两个圆之间的区域是“内部”,中心的区域是“外部”。
另一个选项称为非零环绕规则(如果usesEvenOddFillRule为NO)。非零环绕再次考虑路径上的直线,但计算交点的方式略有不同。它考虑路径的绘制方向。(即,逆时针方向的圆与顺时针方向的圆并不相同。)因此,它是这样的:沿着包含路径的画布以直线前进,从0开始计数。每次穿过路径从左到右(从穿过路径的线路观察)的一部分时,计数器加1。每次穿过路径从右到左的线时,计数器减1。如果计数器不为零,则在路径内部。否则,在外部。
因此,在同心圆示例中,如果两个圆以相同方向绘制,则整个区域(包括中心圆的内部和外部)都将被认为是“路径内部”。如果圆以相反方向绘制,则中心区域将被视为“路径外部”,如偶数-奇数规则所示。

23
这里提供了计算机图形学中填充规则的良好解释。(这是在.NET参考文档中,但完全相同的原理适用于Quartz。)

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

简而言之,偶数奇数填充规则意味着每条边都会出现在输出图形中(这可能导致单个填充路径中有“孔洞”),而非零填充规则在大多数情况下意味着绘制的形状大多是实心的,即使它包含自相交。
下面是一个简单的例子。左侧图像使用偶数奇数填充规则,右侧图像使用非零填充规则。

an example of fill rules


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接