绘制填入区域 之 ALTERNATE 与 WINDING

来源:互联网 发布:网络教育报名时间2017 编辑:程序博客网 时间:2024/05/14 21:39

关于WINDING应该没什么的,主要问题集中在ALTERNATE。

polygon_shape

 

ALTERNATE需要进行两个步骤的分析首先画出的多边形,按照定点的先后次序,会产生组成多边形的各条边交叉和不交叉两种情况,在图中,“points1 polygon shape”的图形是由顶点交叉形成的,“points2 polygon shape”的图形是由顶点未交叉形成的。

在未交叉的情形下,ALTERNATE与WINDING绘制出的效果是一样的。


接下去分析,在顶点组成的边交叉情况下绘制出的图形会存在有些区域被黄颜色填充,有些没有填充。
在填充多边形的时候,显示器是逐行扫描将多边形填满的。就是说如果是个矩形,显示器就是从左到右画最上面一行的一根黄线,然后依次画第二行,第三行,直到最下面一行被黄颜色填满。

画多边形的行为和画矩形是一样的,就是每一行画的线段有长有短而已。这个行为就是逐行扫描,而每一行被称为“扫描行”。
当有左边顶点(10,190)画到右边顶点(170,190)时,这根水平线(扫描行)不一定是连续画的,中间可能会断掉。

譬如,当中间会经过其他的边形成一个交叉点时,这跟水平线需要作出判断,从(10,190)开始遇到的第一个交叉点需要进行编号,(10,190)这个点为1号,第一个交叉点为2号,在1号和2号顶点之间的水平线,显示器是画出来的,根据MSDN的说明:
fills area between odd-numbered and even-numbered polygon sides on each scan line
中文意思:在每一条扫描行上填充奇数边和偶数边之间的区域。


说实话,MSDN的解释十分晦涩,我甚至觉得它的解释不精确,如何解释(10,190)这个点?可以硬套它的解释,不过不懂的人根本无法理解(10,190)这个点究竟算奇数边还是偶数边?
因此更容易理解,还是将MSDN上的边理解为点-- 在每一条扫描行上填充奇数点和偶数点之间的线段。


因此,(10,190)这个点编号为1(再次声明下),遇到的第一条交叉边形成的交叉点为2号点,1和2之间的水平线段进行黄色填充,接下去从2号点开始往右扫描,扫描到又一个交叉点,编号为3号,2号和3号之间不填充黄色,也就是MSDN上说的,在奇数边和偶数边之间进行填充,但在偶数边和奇数边之间不填充。

这里再次更正MSDN的说法,应该是从奇数点到偶数点之间进行填充,从偶数点到奇数点之间不填充

 -- fill line segment from odd-numbered point to even-numbered point and not fill line segment from even-numbered point to odd-numbered point on each scan line.