在PictureBox上绘制折线

我想在PictureBox上绘制折线(由一个或多个线段组成的连续线)。

在此,我们可以通过指定每个线段的端点来创建多条线,并计算每条线的距离,即每条线的距离。

样品

如果您想在PictureBox上执行此操作,最简单的方法是从PictureBoxinheritance您自己的控件,并提供在鼠标按下PictureBox时添加端点的function。

然后,将鼠标单击的位置存储在列表中,并覆盖OnPaint以绘制端点(香港专业教育学院选择4×4方格)和每个端点之间的线。 这是基本代码:

 public class EndPointPictureBox : PictureBox { private List points = new List(); public EndPointPictureBox() { } protected override void OnMouseDown(MouseEventArgs e) { points.Add(new PointF(eX,eY)); base.OnMouseDown(e); this.Invalidate(); } protected override void OnPaint(PaintEventArgs pe) { base.OnPaint(pe); Graphics g = pe.Graphics; foreach(var point in points) g.DrawRectangle(Pens.Black,point.X-2.0f,point.Y-2.0f,4.0f,4.0f); if(points.Count>1) g.DrawLines(Pens.Black,points.ToArray()); } } 

您现在可以像PictureBox一样将它添加到Form中,并选择您想象的方式以常规方式进入它。

如果您尝试在图片框中单击几次,您将看到它像您的示例图像一样绘制您的端点。 这是我机器的一个例子:

示例端点

然后你的下一个要求,获得端点之间的距离。 这可以通过添加一个类来表示EndPoint以及对其隔壁邻居的引用来完成。 然后用一些简单的毕达哥拉斯数学来得到当前点和下一点之间的距离:

 public class EndPoint { public EndPoint(int index, List points) { this.Position = points[index]; if (index < points.Count - 1) this.Next = points[index + 1]; } public PointF Position { get; private set; } public PointF Next { get; private set; } public double GetDistanceToNext() { if(this.Next == PointF.Empty) return 0; var xDiff = this.Position.X - Next.X; var yDiff = this.Position.Y - Next.Y; return Math.Abs(Math.Sqrt((xDiff*xDiff) + (yDiff*yDiff))); } } 

并且您可以向新PictureBox添加一个方法,以获取以下列表:

 public List GetEndPoints() { var list = new List(); for(var i=0;i