繁体   English   中英

使用FillPath创建带孔的多边形

[英]Using FillPath to create a polygon with holes

我有以下代码:

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);
}

其中,polypoly是表示多边形外边界的intpoints(成对的xy )列表,而内部孔是表示多边形侧面中的小孔的intpoints列表。

现在,此代码应绘制一个带有多个孔的多边形。 内部和外部可以作为值给出的示例:

outer
{System.Drawing.PointF[4]}
    [0]: {X=-289, Y=971}
    [1]: {X=-289, Y=0}
    [2]: {X=734, Y=971}
    [3]: {X=-289, Y=971}
inner
{System.Drawing.PointF[4]}
    [0]: {X=-158, Y=797}
    [1]: {X=189, Y=568}
    [2]: {X=-158, Y=568}
    [3]: {X=-158, Y=797}

现在,此代码的结果是仅绘制外部,而忽略孔。 知道为什么吗?

该代码基于问题

尝试使用exclude方法时,如下所示:

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();

这在Region.Exclude(gpe);行上崩溃了Region.Exclude(gpe); 相反,也不例外,只是台式机突然崩溃。

通常,我之前都会加入所有内部图形,并同时创建具有外部和内部图形的GraphicsPath。
默认填充模式会打孔。

我使用Clipper来连接多边形:
http://www.angusj.com/delphi/clipper.php

如果需要修剪外部,则应创建一个修剪区域:
https://msdn.microsoft.com/en-us/library/155t36zz(v=vs.110).aspx

        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);

洞

我已经通过在Paint事件中使用它并在我的Form上绘图(使用了来自PaintEventArgsGraphics来尝试了您的代码。
Exclude尝试实际上可以正常工作。 我认为您的问题出现在此行中:

Region.Exclude(gpe);

原因是,你的意思是

rr.Exclude(gpe);

您要从rr排除GraphicsPath ,稍后再填充。
通过键入Region您可能会削减Control的区域 RegionControl的属性,而不是您想绘制到的实例。
如果您在主Form声明了此方法,这将解释为什么您会遇到“桌面突然崩溃”的情况 ,因为您正在破坏Form的绘图区域。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM