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

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

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

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

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

 

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

[cpp]  view plain  copy
  1. 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 的区域不会被填充,因为射线必须穿越两条边框线,但是这两条边框线的绘制方向相反。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值