C#GraphicsPath绘图问题

时间:2011-01-18 20:51:56

标签: c# .net-2.0 gdi+

我正在尝试在我的程序中绘制一个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);           
    }

我已经在这里以不同的宽度绘制了3次路径,这表明在更大的宽度下问题会变得更糟。

有谁知道为什么会这样,我怎么可能阻止它?任何想法都会非常感激。

干杯,

格雷格

1 个答案:

答案 0 :(得分: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);

它消除了2个弧段中的重叠,然后图形路径可以填充间隙并绘制一个平滑的线段,而不会产生产生“尖峰”的不良角点效应。

从显示的角度来看,在你的线上留下间隙要好得多,而不是有任何重叠。