2009-11-23 99 views
2

使用.NET的System.Drawing.Graphics GDI的東西,我有一個形狀const的兩個點的數組。它們是下圖中的紅色和綠色像素。如何用重疊曲線填充GraphicsPath?

現在我試圖用顏色填充這個形狀的內部。把它畫成簡單的線條就可以。像這樣:

g.DrawCurve(Pens.Red, points1); 
    g.DrawCurve(Pens.Green, points2); 

這給出左圖像(1)。

alt text http://lisa.xms.se/wic/filled.png

爲了填補這件事情,我試圖用一個GraphicsPath這樣的:

GraphicsPath gp = new GraphicsPath(); 
    gp.AddCurve(points1); 
    gp.AddCurve(points2); 
    g.FillPath(Brushes.Blue, gp); 

它的工作原理...八九不離十。問題是當形狀重疊時,你可以在中間圖像(2)中看到,並且不會填充重疊部分。

我試着用gp.widen()獲得大綱,然後後,填補:

 gp.Widen(new Pen(Color.Blue, 3)); 
     g.FillPath(Brushes.Blue, gp); 

這應該工作,但它似乎只填補了3像素切片形狀不整事如圖(3)所示。

任何想法如何解決這個問題?

+0

你可以添加points1和points2初始化? – 2009-11-23 20:18:42

回答

4

默認情況下,GraphicsPath使用枚舉FillMode.Alternate。 需要FillMode.Winding

GraphicsPath gp = new GraphicsPath(FillMode.Winding); 

卷繞模式考慮在每個交叉點的路徑段的方向。它爲每個順時針交點添加一個,併爲每個逆時針交點減一個。如果結果不爲零,則在填充或剪輯區域內考慮該點。零計數意味着該點位於填充或剪輯區域之外。

更多信息here

+0

我其實早些時候嘗試了纏繞模式,但它完全搞砸了填充。它最終證明是最後一點的問題!=數組中的第一個點。所以我扭轉了points2數組,並且注視着FillMode.Winding的作品!我將在明天再次登記並將其標記爲已回答(除非其他內容變成:-) – 2009-11-23 21:51:19