GDI + FillClosedCurve给出了奇怪的循环效果?

时间:2013-08-23 11:35:53

标签: c# graphics gdi+

我正在使用GDI +函​​数FillClosedCurve(在C#中,如果这很重要),绘制一系列点作为一个漂亮的“圆形”曲线区域。问题是,它似乎在生成的形状的一个角上添加了一个奇怪的“循环”形状。屏幕截图显示了我红色区域右上角的这个小额外循环 - My curve screenshot

代码是

g.FillClosedCurve(shapeBrush, shapePoints.ToArray(), FillMode.Winding, 0.4f);
g.DrawPolygon(blackPen, shapePoints.ToArray());

我添加了一个带有DrawPolygon功能的黑色边框,这样你就可以看到我的坐标在哪里。

谁能告诉我为什么我会在右上角得到那个奇怪的循环形状? 谢谢。

1 个答案:

答案 0 :(得分:2)

这是由于您在数组中多次指定相同的点,即作为第一个和最后一个点。

FillClosedCurve“关闭”你的路径....所以没有必要......事实上,指定两次点是不正确的......因为它会尝试关闭路径返回到同一位置的点......导致伪影。

这是一个展示差异的小例子:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    PointF[] arrayDuplicatedPointAtStartAndEnd =
    {
        new PointF(20.0F, 20.0F),
        new PointF(150.0F, 50.0F),
        new PointF(150.0F, 150.0F),
        new PointF(20.0F, 20.0F),
    };

    PointF[] arrayWithoutPointOverlap =
    {
        new PointF(20.0F, 20.0F),
        new PointF(150.0F, 50.0F),
        new PointF(150.0F, 150.0F)
    };

    float tension = 0.4F;

    using (SolidBrush redBrush = new SolidBrush(Color.Red))
    {
        e.Graphics.FillClosedCurve(redBrush, arrayDuplicatedPointAtStartAndEnd, FillMode.Winding, tension);
    }

    e.Graphics.TranslateTransform(110.0f, 0.0f, MatrixOrder.Prepend);

    using (SolidBrush blueBrush = new SolidBrush(Color.Blue))
    {
        e.Graphics.FillClosedCurve(blueBrush, arrayWithoutPointOverlap, FillMode.Winding, tension);
    }
}

enter image description here