2009-11-23 120 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