C# 使用FillPath创建带孔的多边形

C# 使用FillPath创建带孔的多边形,c#,geometry,drawing,draw,gdi+,C#,Geometry,Drawing,Draw,Gdi+,我有以下代码: using (var gp = new GraphicsPath()) { var outer = new PointF[outerpoly.Count]; for (int i = 0; i < outerpoly.Count; i++) { outer[i] = new PointF(((int)(scale * outerpoly[i].X - xmin)), (int)(scale * (outerpoly[i].Y

我有以下代码:

using (var gp = new GraphicsPath())
{    
    var outer = new PointF[outerpoly.Count];
    for (int i = 0; i < outerpoly.Count; i++)
    {
        outer[i] = new PointF(((int)(scale * outerpoly[i].X - xmin)), (int)(scale * (outerpoly[i].Y + -ymin)));
    }
    gp.AddPolygon(outer);
    foreach (var hole in insideholes)
    {
        if (hole.Count < 3) continue;
        var inner = new PointF[hole.Count];
        for (int i = 0; i < hole.Count; i++)
        {
            inner[i] = new PointF(((int)(scale * hole[i].X - xmin)), (int)(scale * (hole[i].Y + -ymin)));
        }
        gp.AddPolygon(inner);
    }
    Graphics.FromImage(e).FillPath(color, gp);
}
现在,该代码的结果是只绘制外部,而忽略孔。知道为什么吗

该代码基于

尝试使用排除方法时,如以下所示:

var outer = new PointF[outerpoly.Count];
for (int i = 0; i < outerpoly.Count; i++)
{
    outer[i] = new PointF(((int)(scale * outerpoly[i].X - xmin)), (int)(scale * (outerpoly[i].Y + -ymin)));
}
var gp = new GraphicsPath();
gp.AddPolygon(outer);
Region rr = new Region(gp);

foreach (var hole in insideholes)
{
    if (hole.Count < 3) continue;
    var inner = new PointF[hole.Count];
    for (int i = 0; i < hole.Count; i++;)
    {
        inner[i] = new PointF(((int)(scale * hole[i].X - xmin)), (int)(scale * (hole[i].Y + -ymin)));
    }
    var gpe = new GraphicsPath();
    gpe.AddPolygon(inner);
    Region.Exclude(gpe);
    gpe.Dispose();
}
gp.Dispose();

Graphics.FromImage(e).FillRegion(color, rr);
rr.Dispose();
var outer=new PointF[outerpoly.Count];
for(int i=0;i

这在行
Region.Exclude(gpe)上崩溃 我在
Paint
事件中使用了您的代码,并在我的
表单上绘制了您的代码(使用
PaintEventArgs
中的
Graphics
)。
您的
Exclude
尝试实际上效果很好。我认为你的问题出现在这方面:

Region.Exclude(gpe);
原因是,你的意思是

rr.Exclude(gpe);
您想从您的
rr
中排除
GraphicsPath
,您将在以后填写。
通过键入
区域
,您可能正在切割
控件的区域
<代码>区域
控件的属性
,而不是要绘制到的实例。

若您在主
窗体中声明了此方法,这将解释为什么您会遇到“桌面突然崩溃”,因为您正在破坏
窗体的绘图区域。

我以前通常会连接所有内部图形,并创建一个包含外部和内部图形的GraphicsPath。
默认填充模式不会填充孔

我使用clipper连接多边形:

如果需要剪裁外部,应创建剪裁区域:


听起来像是(注:vb.net)的复制品。尝试使用
StartFigure
。这个问题涉及的是visual basic而不是c。我该怎么翻译呢?这就是为什么我不投票关闭它。尝试从那里接受答案。如果它对你有效,那么为未来的
C#
程序员发布答案。我也是基于自己,所以我希望我能找出我做错了什么(我的vb真的很糟糕)更像这样。对不起,把wpf弄混了。如果你准备让别人能够:1)重现问题2)尝试解决问题,那会更容易。
rr.Exclude(gpe);
        Graphics g = e.Graphics;
        var path = new GraphicsPath();

        Rectangle outer = new Rectangle(100, 100, 300, 300);
        Rectangle inner = new Rectangle(150, 150, 200, 200);

        path.AddRectangle(outer);
        path.AddRectangle(inner);

        var brush = new SolidBrush(Color.Blue);
        g.FillPath(brush, path);