对alternate和winding填入方式的理解 《windows程序设计》笔记

来源:互联网 发布:javbus防屏蔽域名 编辑:程序博客网 时间:2024/05/21 04:22

 

    看《windows程序设计》,这里又遇到了不明白的地方,又上网查了查,发现很多地方只是对ALTERNATE解释清楚了,可是

 

对WINDING说的还是云里雾里。我觉得虽然自己不一定能弄清楚windows要这样处理的原因,但至少得弄清楚windows这样处理的方法吧。后来看了哪个地方的一段英文,总算明白了。现在自己来总结一下这两种填充方式,如果有错的话,大家指出。

 

==================================

alternate方式  系统默认的方式

 

首先是书上说的假想的线,不知道是不是翻译的原因,按书上的话挺难理解的。我现在的理解是假想的线就是在一条

 

条水平的扫描线,它们跟多边形的边界线相交。当然,对某一个小区域的判断,只需要取一条经过这个区域的扫描线

 

,不过要计算是否得填充这块区域还应该从扫描线刚接触到多边形开始算起。

下面有一句英文

fills area between odd-numbered and even-numbered polygon sides on each scan line

水水地翻译一下:填充这样的区域:与每一条扫描线相交的奇数边和偶数边之间的区域。

 

这里需要解释一下,这里的奇数边和偶数边是有顺序关系的。上面的话的另一层意思:不填充偶数边和奇数边之间的

 

区域。

还有对边数的计算是这样的:扫描线接触到的第一条线算记为1(这和正常的理解一样,不过和程序员的想法可能有

 

点出入),第二条记为2,这样的话1和2之间的区域就应该被填充,所以单独的矩形在默认的情况下都被填充了。而2和

 

3之间的区域则不被填充。这样书上的两个例子都可以解释了。

还有alternate是轮流、交替的意思,我想这也是命名的时候的想法——交替填充。

 

 

===================================

winding方式 弯曲、缠绕的意思 不清楚和命名的关系

 

这里有段英文,很好的解释了winding方式。

When   the   polygon-filling   mode   is   WINDING,   the   system   uses   the   direction   in   

 

which   a   figure   was   drawn   to   determine   whether  to   fill   an   area.   Each   line   

 

segment   in   a   polygon   is   drawn   in   either   a   clockwise   or   a   counterclockwise   

 

direction.   Whenever   an   imaginary   line   drawn   from   an   enclosed   area   to   the   

 

outside   of   a   figure   passes   through   a   clockwise   line   segment,   a   count   

is   incremented.   When   the   line   passes   through   a   counterclockwise   line   segment,   

 

the   count   is   decremented.   The   area   is   filled   if   the   count   is   nonzero   when   

 

the   line   reaches   the   outside   of   the   figure. 

这段话,大家应该都可以看懂,生词比较少。大家看了也就都明白了。

++

下面是自己的翻译加理解。

如果选了WINDING模式,系统会通过一个数字(就是下面讲的计数器)来决定是否填充这块区域。区域的每条边界线

 

不是顺时针就是逆时针(自己假定一个画的轨迹,然后标注正逆方向),而系统用一条假想的线(从左向右)穿过区

 

域(可以假想为屏幕上水平的扫描线),当这条假想的线经过逆时针的边界线时,那个计数器就增加(自定义+1,

 

当然计数器初始值为0);当经过顺时针的边界线时,那个计数器就减少(自定义-1)。随着假想的线(从左往右)

 

走动,在计数器为非0的时候,就填充经过的区域。(注意是非0)

 

这样的话,书上例子也很好理解了。填充五角星的时候,对中间部分分为上下两部分讨论,对上面的部分,我的画法的结果是:+1,+1,-1,-1。在扫描线经过我们画的区域里时计数器的值一直非0,而不在我们的区域里时计数器都是0。这样整个五角星都被填满了。第二个矩形的例子也很好理解了。

 

弄懂了这个问题,我突然感觉,毕竟这是外国人弄出来的玩意,如果看不懂老外写的东东,就只能看国内二手的资料,多少理解上会出现偏差哦。从这点可以看出学好英语,很重要。

最后附两张图,以后自己看的时候可以验证一下。

原创粉丝点击