Pregunta

Quiero dibujar polilínea (una línea continua compuesta de uno o más segmentos de línea) en PictureBox.

En esto podemos crear múltiples líneas especificando los puntos finales de cada segmento, así como calcular la distancia de cada segmento que es la distancia de cada línea.

Sample

¿Fue útil?

Solución

Si quieres hacer esto en una caja de imágenes, lo más fácil es heredar tu propio control de un PictureBox y proporcione la funcionalidad para agregar puntos finales cuando realice el mouse sobre la caja de imágenes.

Luego almacena la posición del clic del mouse en una lista y anula el OnPaint Para dibujar sus puntos finales (he elegido un cuadrado 4x4) y una línea entre cada punto final. Este es el código básico:

public class EndPointPictureBox : PictureBox
{
    private List<PointF> points = new List<PointF>();
    public EndPointPictureBox()
    {
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        points.Add(new PointF(e.X,e.Y));
        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());

    }
}

Ahora puede agregar esto a un formulario como una caja de imágenes y elegir su imagen para entrar en él de la manera habitual.

Si intenta hacer clic varias veces dentro de la caja de imágenes, verá que dibuja sus puntos finales como su imagen de ejemplo. Aquí hay un ejemplo de mi máquina:

Example endpoints

Luego, su próximo requisito, obtenga la distancia entre los puntos finales. Esto se puede hacer agregando una clase para representar un EndPoint con una referencia a su vecino de al lado. Luego, son algunas matemáticas pitagóricas simples para obtener la distancia entre el punto actual y el siguiente:

public class EndPoint
{
    public EndPoint(int index, List<PointF> 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)));
    }
}

Y puede agregar un método a su nuevo cuadro de imagen para obtener esta una lista de estos:

public List<EndPoint> GetEndPoints()
{
    var list = new List<EndPoint>();
    for(var i=0;i<points.Count;i++)
        list.Add(new EndPoint(i,points));
    return list;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top