ALTERNATE: 假象从上至下水平扫描线扫过整个图形,当扫描线从左往右碰到图形的第一条边时,该边记0。由于图形都是有入边和出边的,如果出边为奇数便填充该图形。
如上图形会被填充,因为出边为奇数。
接下来看复杂一点的图形:

记得: 扫描线第一次碰到的边要标0
先看1号扫描线,把其穿过的那块三角形看成一个单独的图形,其出边为1即奇数,所以填充。
再看2号扫描线,同样2号扫描线一共穿过了3块图形,分别是三角形,四边形,三角形。也是同样把他们看成单独的图形块。第一个三角形出边标号为1即奇数所以填充,第二个四边形出边为2即偶数所以不填充。第三个大三角形出边是3即奇数所以填充。
有了前面两个的基础,第3号扫描线大家可以自己看。
WINDING: 这个映射模式下,如果出边号为奇数则与ALTERNATE模式一样要填充。有了上面的经验可以知道ALTERNATE模式下,出边是偶数是不需要填充的。但WINDING如果出边是偶数的情况下是否需要填充还要进一步判断。
如图:


上图中,扫描线所碰到的图块有三块,但是不管出边是奇数还是偶数都被填充了。如果说是ALTERNATE模式,中间的五边形图块是不应该被填充的,因为它的出边是2为偶数。
WINDING模式下,首先我们以任意为图形标上一个方向,使其成为有向图。但是注意该图形是封闭的,也就是说起点同样也是终点。
想像SetPolyFillMode函数内部维护一个计数器(是否真的有我不知道,但是可以这么理解),如果扫描线碰到的边方向往上,那么计数器+1,方向往下则计数器-1,只有计数器不为0则填充,如果计数器为0则不填充。
该判断是以入边为基准的。什么叫以入边为基准意思就是: 如上图,首先扫描线碰到第一个三角形的入边,其方向向上,所以计数器变成了1。由于我们以入边为基准所以该图块的判断已经结束,扫描完入边发现计数器为1不为0所以填充。再看第二个图块是五边形,它的入边也就是第一个三角形的出边。其方向也是向上,所以计数器在+1,现在计数器总数为2所以不为0即填充。再看最后一个三角形图块。其入边为前一个五边形的出边,方向向下所以计数器-1。现在计数器总数为1不为0。所以该图块被填充。
这里仅仅一根扫描线,可以自己尝试扫描整个图形。用这种规则就可以顺利判断是否需要填充。
完

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/68214.html