美文网首页
非零绕组规则与奇偶规则

非零绕组规则与奇偶规则

作者: 00d1ed2b53ae | 来源:发表于2018-11-02 16:41 被阅读6860次

    **该方法常用与判断点是否在多边形或曲线上。

    给定一条曲线C和一个点P,构造一条从P点出发射向无穷远的射线。找出所有该射线和曲线的交点,并按如下规则统计绕组数量(winding number):

    每一个顺时针方向(曲线从左向右通过射线)上的交点减1,每一个逆时针方向(曲线从右向左通过射线)上的交点加1。如果绕组总数为0,表示该点在曲线外;否则,该点在曲线内。

    image.png

    该规则和奇偶规则的区别如下:**


    ** 非零绕组及奇偶规则

    上图中左下角是按照奇偶规则填充效果,右下图是按照非零绕组规则填充的效果:
    从P点射出一条指向无穷远的射线,对于奇偶规则,曲线和射线有两个交点(或交点个数为偶数)。因此,按照奇偶规则,点P在曲线之外;对于非零规则,曲线在顺时针方向上被射线分割两次,绕组值为-2,非零。因此P点是在曲线上的点。

    下面这个来自Developer-apple的图也很能说明问题:


    image.png

    CGContextFillPath,CGContextClip 使用的是非零绕组规则

    CGContextEOClip 使用的是奇偶规则

    Graphic 矢量图形的区域填充与缠绕规则

    1. 缠绕规则概念

    增强的绘图 API 还引入了路径“缠绕”的概念:路径的方向。

    路径的缠绕可以是正向的(顺时针),也可以是负向的(逆时针)。渲染器为 data 参数解释矢量所提供坐标的顺序确定了缠绕的方向。

    正向缠绕和负向缠绕

    正向缠绕和负向缠绕

    A. 指示绘制方向的箭头

    B.
    正向缠绕(顺时针)

    C.负向缠绕(逆时针)

    此外,请注意Graphics.drawPath() 方法可选的第三个参数“winding”:

    drawPath(commands:Vector.<int>, data:Vector.<Number>, winding:String = "evenOdd"):void

    在这种情况下,第三个参数是一个字符串或常量,用于指定相交路径的缠绕或填充规则。(这些常量值在 GraphicsPathWinding 类中定义为 GraphicsPathWinding.EVEN_ODD 或GraphicsPathWinding.NON_ZERO。)当路径相交时,缠绕规则十分重要。

    奇偶规则是标准的缠绕规则,早期的绘图 API 都使用此规则。奇偶规则也是 <Graphics.drawPath() 方法的默认规则。

    使用奇偶缠绕规则时,任何相交路径都交替使用开放填充与闭合填充。如果使用同一填充绘制的两个正方形相交,则不会填充相交的区域。通常,相邻区域不会都填充或都不填充。

    另一方面,非零规则依靠缠绕(绘制方向)来确定是否填充相交路径定义的区域。当相对缠绕的路径相交时,不填充所定义的区域,这与奇偶规则十分类似。对于相同缠绕的路径,将填充本来不填充的区域:

    用于相交区域的缠绕规则

    用于相交区域的缠绕规则

    A. 奇偶缠绕规则

    B.非零缠绕规则

    2. 缠绕规则

    这些名称系指用于定义如何管理填充的更具体规则。正向缠绕路径将得到赋值 +1;负向缠绕路径将得到赋值 -1。

    ** 以形状上闭合区域中的一点为起点,绘制一个从该点向外无限延伸的线条。使用该线条与路径相交的次数以及这些路径的组合值来确定填充。**

    ** 对于奇偶缠绕,使用该线条与路径相交的次数。如果计数为奇数,则填充相交区域。如果计数为偶数,则不填充相交区域。**

    对于非零缠绕,使用赋予路径的值。如果路径的组合值不为 0,则填充相交区域。如果组合值为 0,则不填充相交区域。

    缠绕规则计数和填充

    缠绕规则计数和填充

    A. 奇偶缠绕规则

    B. 非零缠绕规则

    3. 缠绕使用

    这些填充规则很复杂,但有些情况下必须使用它们。例如绘制星形时。如果使用标准奇偶规则,该形状需要十个不同的线条。如果使用非零缠绕规则,所需十个线条将减少为五个。下面的 ActionScript 使用五个线条和非零缠绕规则来绘制星形:

    graphics.beginFill(0x60A0FF); graphics.drawPath( Vector.<int>([1,2,2,2,2]), Vector.<Number>([66,10, 23,127, 122,50, 10,49, 109,127]), GraphicsPathWinding.NON_ZERO);

    星形如下所示:

    使用不同缠绕的星形

    使用不同缠绕规则的星形

    A. 奇偶 10 个线条
    B. 奇偶 5 个线条
    C. 非零 5 个线条

    如果对图像进行了动画处理,或图像用作三维对象上的纹理且发生重叠,则缠绕规则会变得更为重要

    相关文章

      网友评论

          本文标题:非零绕组规则与奇偶规则

          本文链接:https://www.haomeiwen.com/subject/cyycxqtx.html