【发布时间】:2016-01-04 12:30:56
【问题描述】:
我有以下代码:
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);
}
其中 outerpoly 是代表多边形外边界的 intpoints 列表(x 和 y 对),而 inside hole 是代表多边形侧面孔洞的 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}
现在这段代码的结果是只绘制了外部而忽略了孔。知道为什么吗?
代码基于question。
当尝试使用排除方法时,如下所示:
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);线上崩溃了,没有例外,只是桌面突然崩溃。
【问题讨论】:
-
听起来像是 this 的骗子(注:vb.net)。尝试使用
StartFigure。 -
那个问题涉及的是 Visual Basic 而不是 C#。我该如何翻译呢?
-
这就是我不投票关闭它的原因。尝试从那里接受的答案。如果它适合你,那么为未来的
C#-only 程序员发布答案。 -
我也是基于stackoverflow.com/questions/4021078/…,所以我希望我能找出我做错了什么(我的vb真的很糟糕)
标签: c# geometry drawing draw gdi+