使用c#绘制两条线之间的链接或路径

时间:2018-04-25 18:05:50

标签: c# winforms gdi+ system.drawing

我正在尝试在两行之间绘制一条路径,如下所示。

wanted graph

我使用以下代码来执行此操作

        Pen usedpen= new Pen(Color.Black, 2);
        //Point[] p = {
        //    new Point(518,10),
        //    new Point(518,20),
        //    new Point(518-85,15)
        //};
        GraphicsPath path = new GraphicsPath();

        path.StartFigure();
        path.AddLine(new Point(518, 10), new Point(433, 10));
        path.AddLine(new Point(518, 40), new Point(433, 40));
        path.AddLine(new Point(433,10), new Point(433,40));
        //usedpen.LineJoin = LineJoin.Round;
        e.Graphics.DrawPath(usedpen, path);

但在使用此代码后,将绘制以下图形:

Result

任何帮助
提前致谢

3 个答案:

答案 0 :(得分:4)

哦,你正在使用onPaint事件,所以问题是你正在绘制一条路径,这意味着Point将从第一行的末尾开始到下一行的开始。

第一行之后

path.AddLine(new Point(518, 10), new Point(433, 10));

现在点位于(433,10)

现在下一行说从(518,40)到(433,40)

现在实际发生的是从(433,10)到(518,40)的一条线,因为它是一条继续绘制的路径。

 GraphicsPath path = new GraphicsPath();
 path.StartFigure();
 path.AddLine(new Point(518, 10), new Point(433, 10));
 path.AddLine(new Point(433, 10), new Point(433, 40));
 path.AddLine(new Point(433, 40), new Point(518, 40));
 usedpen.LineJoin = LineJoin.Round;

答案 1 :(得分:2)

默认情况下,每当您添加一个数字时,请说一个Line to GraphicPath,它的起点将连接到最后一个数字的终点。因此,订单很重要!

防止这种情况的方法是,只要您想绘制未连接的行,就可以使用StartFigure

  

在不关闭当前数字的情况下启动新数字。随后都是   添加到路径中的点将添加到此新图中。

    Pen usedpen= new Pen(Color.Black, 2);
    //Point[] p = {
    //    new Point(518,10),
    //    new Point(518,20),
    //    new Point(518-85,15)
    //};
    GraphicsPath path = new GraphicsPath();

    path.StartFigure();
    path.AddLine(new Point(518, 10), new Point(433, 10));
    path.StartFigure();   // <---
    path.AddLine(new Point(518, 40), new Point(433, 40));
    path.StartFigure();   // <---
    path.AddLine(new Point(433,10), new Point(433,40));
    //usedpen.LineJoin = LineJoin.Round;
    e.Graphics.DrawPath(usedpen, path);

enter image description here

当然你的问题基本上是错误的订单或绘图线,所以另一个答案是正确的。

绘制连线(btw)的推荐方法是使用AddLines,因为它可以避免线关节,帽子或斜角的问题。

答案 2 :(得分:1)

一种类似的方法,使用GraphicsPath.AddLines()(也可以处理创建的对象)。

GraphicsPath.StartFigure()未使用,因为它是唯一绘制的数字。当更多的点添加到GraphicsPath时,.StartFigure()将创建一个新的子路径,而不链接预先存在的子路径。

可以使用GraphicsPathIterator解析子路径,以测试它们包含的形状类型。

using (GraphicsPath path = new GraphicsPath())
{
    Point[] points = new Point[] {
        new Point(518, 10), new Point(433, 10),
        new Point(433, 40), new Point(433, 40),
        new Point(433, 40), new Point(518, 40)
    };

    path.AddLines(points);
    e.Graphics.DrawPath(new Pen(Color.Black, 2), path);

    //Add a new figure
    path.StartFigure();
    path.AddEllipse(new Rectangle(450, 40, 50, 50));
    e.Graphics.DrawPath(new Pen(Color.Black, 2), path);
};