2025年关于SetPolyFillMode中ALTERNATE与WINDING问题

关于SetPolyFillMode中ALTERNATE与WINDING问题ALTERNATE 假象从上至下水平扫描线扫过整个图形 当扫描线从左往右碰到图形的第一条边时 该边记 0 由于图形都是有入边和出边的 如果出边为奇数便填充该图形 如上图形会被填充 因为出边为奇数 接下来看复杂一点的图形 记得 扫描线第一次碰到的边要标 0 先看 1 号扫描线

大家好,我是讯享网,很高兴认识大家。

    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。所以该图块被填充。

这里仅仅一根扫描线,可以自己尝试扫描整个图形。用这种规则就可以顺利判断是否需要填充。

 

 

 

小讯
上一篇 2025-02-09 15:19
下一篇 2025-03-30 23:28

相关推荐

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