1. 程式人生 > >5.4.1 Polygon 函式和多邊形填充模式

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