C#绘图路径绘制问题

3

我正在尝试在我的程序中绘制一个GraphicsPath,但似乎存在问题,它会在路径中添加随机尖峰。这似乎会随着路径变宽而变得更糟。我编写了一些测试代码,可以复制此问题。

这段代码需要一个带有PictureBox的表单(PictureBox尺寸至少为630 x 1050),以及一个单独的按钮。然后代码如下:

    private void button1_Click(object sender, EventArgs e)
    {
        drawSomeLines();

        pictureBox1.Refresh();
    }

    private void drawSomeLines()
    {
        //initialise the plot area:
        Bitmap image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
        pictureBox1.BackgroundImage = image;

        Graphics g = Graphics.FromImage(image);

        //create a graphics path:
        GraphicsPath gPath = new GraphicsPath();

        //add sections to the path:
        gPath.AddLine(587.310059F, 29.2261658F, 229.974731F, 668.2402F);
        gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.532426F);
        gPath.AddArc(new RectangleF(203.177368F,560.3876F,421.357F,421.357F), -(90 - 297.72672132554612F), -1.53240252F);
        gPath.AddLine(224.740067F,678.2186F, 76.6899643F,979.773865F);

        //draw the path 3 times, at different widths:
        g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(100, Color.Blue)), 80), gPath);
        g.DrawPath(new Pen(new SolidBrush(Color.Blue), 40), gPath);
        g.DrawPath(new Pen(new SolidBrush(Color.Red), 2), gPath);           
    }

我在此处以不同的宽度绘制了路径三次,这显示出在更大的宽度下问题会变得更严重。请问有人知道这是为什么,并且我该如何预防呢?如果有任何想法,将不胜感激。谢谢,Greg。

1
点之间没有连接。在线条粗度为3的情况下,不连续性非常明显。 - Hans Passant
我没有看到这个。毕竟,它们都被添加到图形路径中,所以它们肯定必须连接。例如,即使我添加了两条天各一方的不同线路然后绘制路径,它仍然会将它们连接起来。 - Greg
1个回答

4
您可能已经发现了,这就是您的线路出现“尖峰”的原因:
当您向图形路径对象添加第二个弧时,其起始点出现在您添加的第一个弧的终点之前。此时,图形路径必须返回以开始绘制第二个弧,并且您最终会得到一些非常尖锐和奇怪形状的拐角,特别是在较大的线宽下。
如果您的线路中有间隙,graphicspath会很好地填充它们,但是如果有重叠,则结果不太好。
如果您更改此代码行:
gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.532426F);

转换为:

gPath.AddArc(new RectangleF(203.177338F,560.3876F,421.357F,421.357F), -(90 - 299.21382700000413F), -1.0F);

它可以消除您的两个圆弧段之间的重叠,然后graphicspath可以填补间隙并绘制平滑的线段,而不会产生会产生“尖峰”的不良角效果。

从显示的角度来看,与其有任何重叠,不如在您的线条中留有间隙更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接