5.4.1 Polygon 函数和多边形填充模式

        摘录于《Windows程序(第5版,珍藏版).CHarles.Petzold 著》P138

        前面已讨论过 5 个区域填充函数,Polygon 是第 6 个画带边框线并填充图形的函数,这个函数的调用类似于 Polyline 函数的调用:

Polygon (hdc, apt, iCount);
其中,参数 apt 是一个 POINT 结构的数组,iCount 是点的个数。如果数组中最后一个点与第一个点不同,则 Windows 会再加一条线连接最后一个点与第一个点。(在 Polyline 函数中不会这么做。)PolyPolygon 函数的调用形式如下:
PolyPolygon (hdc, apt, aiCount, iPolyCount);
这个函数会绘制多个多边形。最后一个参数是绘制的多边形的个数。对每个多边形,数组 aiCounts 给出了多边形顶点的个数。数组 apt 含有全部多边形的所有顶点。除了返回值外,PolyPolygon 在功能上等同于下面的代码:

for (i = 0; iAccum = 0; i < iPolyCount; ++ i)
{   <pre name="code" class="cpp">    Polygon (hdc, apt + iAccum, aiCount[i]);
    iAccum += aiCounts[i];
}

 

        对 Polygon 和 Polygon 函数,Windows 都使用设备环境中的当前画刷来填充区域。至于内部是如何填充的,要取决于多边形的填充模式,可以调用 SetPolyFillMode 函数来设置:

SetPolyFillMode (hdc, iMode);
在默认情况下,多边形的填充模式是 ALTERNATE(交替),但是也可以将它设定为 WINDING(螺旋)。这两种方式的区别如图 5-19 所示。

        首先,ALTERNATE 和 WINDING 模式的区别看起来似乎相当简单。对于 ALTERNATE 映射模式,你可以想象从一个封闭区域中的一个点向无穷远处画一条射线。只有该射线穿越奇数条边框线时,封闭区域才会被填充。这就是为什么该五角星的角被填充,而中心未被填充的原因。

        这个五角星的例子让使用 WINDING 模式看上去比实际情况更简单。在绘制一个多边形时,WINDING 模式在大多数情况下回填充所有封闭区域,但是也有例外。

        在 WINDING 模式下,要确定一个区域是否应该被填充,同样可以设想从区域内的一个点画一条伸向无穷远的射线。如果射线穿过奇数条边框线,则区域被填充,这和 ALTERNATE 模式相同。如果射线穿过偶数条边框线,情况比较复杂,还要考虑到边框线的绘制方向:在被穿越的偶数条边框线中,不同方向的边框线(相对于射线的方向)的数目如果相等,则区域不会被填充;不同方向的边框线(相对于射线的方向)的数目如果不相等,则区域会被填充。

        以图 5-20 所示的物体为例。线上的箭头表示画线的方向。WINDING 模式 和 ALTERNATE 模式都会填充三个封闭的 L 型区域,号码为从 1 到 3。两个更小的内部区域,号码为 4 和 5,在 ALTERNATE 模式下就不被填充。但是在 WINDING 模式下,号码 5 的区域会被填充,这是因为从区域的内部到达图形的外部必须穿过两条相同方向的线。号码为 4 的区域不会被填充,因为射线必须穿越两条边框线,但是这两条边框线的绘制方向相反。


  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值