Quartz在填充区域时有两套规则:非零缠绕数规则(nonzero windingnumber rule)偶数-奇数规则(Even-odd)

  1. 非零缠绕数规则:为了确定一个点是否需要绘制,我们从该点开始绘制一条直线穿过绘图的边界。从0开始计数,每次路径片断从左到右穿过直线时,计数加1;而从右到左穿过直线时,计数减1。如果结果为0,则不绘制该点,否则绘制。注意这种规则下,路径片断绘制的方向会影响到结果。

  2. 偶数-奇数规则:为了确定一个点是否被绘制,我们从该点开始绘制一条直线穿过绘图的边界。计算穿过该直线的路径片断的数目。如果是奇数,则绘制该点,如果是偶数,则不绘制该点。这种情况下,路径片断绘制的方向不影响结果。

官方文档给出了下图来演示两种规则的效果。

不过今天测试了一下,发现与文档有出入,可能是理解不对。绘制代码如下图所示,

测试代码如下图所示,

绘制结果如下图所示。

填充规则除了这两种,还有PositiveNegative,有兴趣的可以研究一下。

参考

  1. Nonzero-rule
  2. Even–odd rule
  3. Quartz 2D编程指南之三:路径(Path)
  4. PolyFillType