zoukankan      html  css  js  c++  java
  • 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 程序设计》第五版 中的图,是不是很好懂了。

  • 相关阅读:
    Unity ShaderLab学习总结
    shader内置变量
    关于Unity中Shader的内置值
    Canvas控件最后一蛋——CanvasGroup
    Unity中关于Device Filter的选择问题
    Unity中使用扩展方法解决foreach导致的GC
    如何精简Unity中使用的字体文件
    好插件让你事半功倍!【资源篇】
    BFC(块级格式化上下文)的作用及生产方法
    获取视频或者音频时长
  • 原文地址:https://www.cnblogs.com/ziolo/p/3145219.html
Copyright © 2011-2022 走看看