Non-Zero Winding Number Rule 非零绕组规则该方法常用与判断点是否在多边形或曲线上。
给定一条曲线C和一个点P,构造一条从P点出发射向无穷远的射线。找出所有该射线和曲线的交点,并按如下规则统计绕组数量(winding number):
每一个顺时针方向(曲线从左向右通过射线)上的交点减1,每一个逆时针方向(曲线从右向左通过射线)上的交点加1。如果绕组总数为0,表示该点在曲线外;否则,该点在曲线内。
该规则和奇偶规则的区别如下:
上图中左下角是按照奇偶规则填充效果,右下图是按照非零绕组规则填充的效果:
从P点射出一条指向无穷远的射线,对于奇偶规则,曲线和射线有两个交点(或交点个数为偶数)。因此,按照奇偶规则,点P在曲线之外;对于非零规则,曲线在顺时针方向上被射线分割两次,绕组值为-2,非零。因此P点是在曲线上的点。
下面这个来自Developer-apple的图也很能说明问题:
CGContextFillPath,CGContextClip 使用的是非零绕组规则
CGContextEOClip 使用的是奇偶规则