5 4 1 Polygon 函式和多邊形填充模式

2021-07-16 18:09:57 字數 1743 閱讀 2330

摘錄於《windows程式(第5版,珍藏版).charles.petzold 著》p138

前面已討論過 5 個區域填充函式,polygon 是第 6 個畫帶邊框線並填充圖形的函式,這個函式的呼叫類似於 polyline 函式的呼叫:

[cpp]view plain

copy

polygon (hdc, apt, icount);  

其中,引數 apt 是乙個 point 結構的陣列,icount 是點的個數。如果陣列中最後乙個點與第乙個點不同,則 windows 會再加一條線連線最後乙個點與第乙個點。(在 polyline 函式中不會這麼做。)polypolygon 函式的呼叫形式如下:

[cpp]view plain

copy

polypolygon (hdc, apt, aicount, ipolycount);  

這個函式會繪製多個多邊形。最後乙個引數是繪製的多邊形的個數。對每個多邊形,陣列 aicounts 給出了多邊形頂點的個數。陣列 apt 含有全部多邊形的所有頂點。除了返回值外,polypolygon 在功能上等同於下面的**:

[cpp]view plain

copy

for(i = 0; iaccum = 0; i 

對 polygon 和 polygon 函式,windows 都使用裝置環境中的當前畫刷來填充區域。至於內部是如何填充的,要取決於多邊形的填充模式,可以呼叫 setpolyfillmode 函式來設定:

[cpp]view plain

copy

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 的區域不會被填充,因為射線必須穿越兩條邊框線,但是這兩條邊框線的繪製方向相反。

求任意多邊形面積(凹多邊形和凸多邊形)

遇到問題 已知多邊形的各個左邊點,要求多邊形的面積 然後我搜尋了下看到這篇文章 這個人說的不多,但是簡單明瞭 首先已知各定點的座標分別為 x1,y1 x2,y2 x3,y3 xn,yn 則該多邊形的面積公式為 s 1 2 x1 y2 x2 y1 x2 y3 x3 y2 xk yk 1 xk 1 yk...

08 多邊形內角和

總時間限制 1000ms 記憶體限制 65536kb 描述 在歐幾里德幾何中,n邊形的內角和是 n 2 180 已知其中 n 1 個內角的度數,就能計算出剩下的乙個未知內角的度數。請編寫乙個程式,來解決這個問題。輸入 第1行只有乙個整數n 2第2行有 n 1 個正整數,是每個已知內角的度數。相鄰兩個...

08 多邊形內角和

總時間限制 1000ms 記憶體限制 65536kb 描述 在歐幾里德幾何中,n邊形的內角和是 n 2 180 已知其中 n 1 個內角的度數,就能計算出剩下的乙個未知內角的度數。請編寫乙個程式,來解決這個問題。輸入 第1行只有乙個整數n 2第2行有 n 1 個正整數,是每個已知內角的度數。相鄰兩個...