如何用重叠曲线填充 GraphicsPath?

Mar*_*man 2 .net c# graphics gdi+

使用 .NET 的System.Drawing.GraphicsGDI 东西,我有一个由两个点数组组成的形状。它们是下图中的红色和绿色像素。

现在我试图用颜色填充这个形状的内部。把它画成简单的线条就可以了。像这样:

    g.DrawCurve(Pens.Red, points1);
    g.DrawCurve(Pens.Green, points2);
Run Code Online (Sandbox Code Playgroud)

这给出了左图 (1)。

替代文本 http://lisa.xms.se/wic/filled.png

为了填充这个东西,我尝试使用GraphicsPath这样的:

   GraphicsPath gp = new GraphicsPath();
   gp.AddCurve(points1);
   gp.AddCurve(points2);
   g.FillPath(Brushes.Blue, gp);
Run Code Online (Sandbox Code Playgroud)

它有效......有点。问题是当形状重叠时,如中间图像 (2) 所示,并且不会填充重叠部分。

我尝试使用gp.widen()来获取轮廓,然后填充:

      gp.Widen(new Pen(Color.Blue, 3));
      g.FillPath(Brushes.Blue, gp);
Run Code Online (Sandbox Code Playgroud)

这应该可行,但它似乎只填充了形状外部的3 像素切片,而不是整个形状,如图 (3) 所示。

有什么想法如何解决这个问题吗?

Mic*_*l G 6

默认情况下,GraphicsPath 使用FillMode.Alternate枚举。你需要FillMode.Winding

GraphicsPath gp = new GraphicsPath(FillMode.Winding);
Run Code Online (Sandbox Code Playgroud)

缠绕模式考虑每个交叉点处路径段的方向。它为每个顺时针交叉点加一,并为每个逆时针交叉点减一。如果结果非零,则该点被视为在填充或剪切区域内。零计数意味着该点位于填充或剪切区域之外。

更多信息请点击此处