如何将最后一个绘图点与下一个绘图点连接起来?

时间:2013-12-05 21:06:33

标签: c# winforms

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                points.Add(new PointF(e.X * xFactor, e.Y * yFactor));
                pictureBox2.Invalidate();
                label5.Visible = true;
                label5.Text = String.Format("X: {0}; Y: {1}", e.X, e.Y);
                counter += 1;
                label6.Visible = true;
                label6.Text = counter.ToString();
            }
        }

        private void pictureBox2_Paint(object sender, PaintEventArgs e)
        {
            Pen p;
            p = new Pen(Brushes.Green);
            foreach (PointF pt in points)
            {
                e.Graphics.FillEllipse(Brushes.Red, pt.X, pt.Y, 3f, 3f);
            }
            foreach (PointF pt in points)
            {
                if (points.Count > 1)
                {
                    e.Graphics.DrawLine(p, pt.X, pt.Y, 3f, 3f);
                }
            }
        }

当我点击pictureBox1时,它在pictureBox2上画了一个点。

在pictureBox2中,我在点列表和绘图上做了一个循环。

然后我做了另一个循环,在DrawLine中,我想将最后一个点与下一个点连接起来,我该怎么办呢?

现在试过这个:

for (int i = 0; i < points.Count; i++)
            {
                if (points.Count > 1)
                {
                    e.Graphics.DrawLine(p, points[i].X, points[i].Y, points[i+1].X, points[i+1].Y);
                    break;
                }
            }

但这只会连接前两个点,而不是所有其他点。

我希望每次点击并绘制一个新点时,它都会自动连接到最后一个绘制点的一条线。

2 个答案:

答案 0 :(得分:0)

你应该使用GraphicsPath看看这个link类来做这个,例如画一条线用这个

private void AddLineExample(PaintEventArgs e)
{

    //Create a path and add a symetrical triangle using AddLine.
    GraphicsPath myPath = new GraphicsPath();
    myPath.AddLine(30, 30, 60, 60);
    myPath.AddLine(60, 60, 0, 60);
    myPath.AddLine(0, 60, 30, 30);    
    // Draw the path to the screen.
    Pen myPen = new Pen(Color.Black, 2);
    e.Graphics.DrawPath(myPen, myPath);
}

答案 1 :(得分:0)

break只允许绘制一条线。由于您需要一次访问2个点,因此必须小心保持数组索引在边界内。如果您通过i+1选择第二个点,则需要for循环停止i < points.Count - 1,以便在最后为您提供空间。