我正在尝试在两行之间绘制一条路径,如下所示。
我使用以下代码来执行此操作
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);
但在使用此代码后,将绘制以下图形:
任何帮助
提前致谢
答案 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);
当然你的问题基本上是错误的订单或绘图线,所以另一个答案是正确的。
绘制连线(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);
};