windows 程序设计 SetPolyFillMode关于ALTERNATE、WINDING的详细解释
看windows程序第五章GDI编程部分。一直卡壳在这里了。
下面我来说下自己的想法。看是否对您有帮助。
首先我们来看一个图。
SetPolyFillMode(ALTERNATE); // 系统默认就是这种填充模式
如图所示:数字代表绘制图形点的先后次序。
现在。我们先从外面假设来一条射线,(当然了。我看到很多文章。说的都是屏幕水平方向的扫描线。)
对于这种模式。射线穿过奇条边框线时,则填充该边框线区域,穿过偶数条边框线时,则不填充。
大家对照上图的射线。很简单的就理解了“ALTERNATE”填充模式。
下面重点是“WINDING”填充模式:
继续看图:
对于射线穿过奇数边框线时,填充模式同ALTERNATE, 唯一不同的就是在穿过偶数条边框线时。要作另外的判断。
怎么判断偶数边的时候呢?
首先我们假想一下:在图中。垂直画一条线。向上为正。向下为负。对于WINDING填充模式。判断是否填充区域就是按照:遇到“封闭区域”偶数条边框线的时候。我们就要
看所有边框线的方向计数了。如果边框线向上。则计数加1.如果向下。则计数减1.只有计数不等于0 的时候,才填充偶数边框线封闭区域。
最后在附张图作最后说明:
对于A来说。射线穿过的第一条边框线为奇数。所以按照“ALTERNATE”来填充。
穿过第二条边框线的时候。为偶数。就要开始算边框线的方向计数了。我们可以看到第一条边框线向上。我们+1。第二条也向上。在+1;不等于0。则填充了。
穿过第三条边框线。又是奇数。所以继续按照"ALTERNATE"来填充。
好了。重点来了。第四条边框线出现了。也就是没有填充的D区域。我们来算下它的所有边框线的方向计数是多少。
+1、+1、-1、-1;看到没。前两条边框线都向上。后两条都向下。最后计数等于0.就不填充该区域了。
有了上面的解释。我们在来看《windows 程序设计》第五版 中的图,是不是很好懂了。