2011-09-09 3 views
2

Je souhaite dessiner une polyligne (une ligne continue composée d'un ou plusieurs segments de ligne) sur PictureBox. En cela, nous pouvons créer plusieurs lignes en spécifiant les extrémités de chaque segment ainsi que calculer la distance de chaque segment qui est la distance de chaque ligne.Dessiner une polyligne sur PictureBox

Sample

+0

Joliment a demandé. Les images sont les meilleures. Les gens aiment mal comprendre! – Bitterblue

Répondre

1

Si vous voulez faire un picturebox, la meilleure chose est d'hériter votre propre contrôle d'un PictureBox et fournir les fonctionnalités à ajouter extrémités lorsque vous la souris sur la picturebox.

Vous stockez ensuite la position du clic de la souris dans une liste et remplacez le OnPaint pour dessiner vos points de terminaison (vous avez choisi un carré 4x4) et une ligne entre chaque point de terminaison. Voici le code de base:

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()); 

    } 
} 

Vous pouvez maintenant ajouter à un formulaire comme un PictureBox, et choisissez votre imagge pour aller à l'intérieur de la manière habituelle.

Si vous essayez de cliquer plusieurs fois dans la zone d'image, vous verrez qu'elle dessine vos points de terminaison comme votre exemple d'image. Voici un exemple de ma machine:

Example endpoints

Ensuite, votre prochaine exigence, obtenir la distance entre les points d'extrémité. Cela peut être fait en ajoutant une classe pour représenter un EndPoint avec une référence à son voisin. Ensuite, ses quelques mathématiques pythagoriciens simples pour obtenir la distance entre le point courant et le suivant:

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))); 
    } 
} 

Et vous pouvez ajouter une méthode à votre nouveau PictureBox pour obtenir cette liste de ceux-ci:

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; 
} 
+0

merci .... Je l'ai eu !!! – cooldj

+0

si je veux dessiner cette distance calculée au milieu de chaque segment de ligne alors comment pourrais-je faire? comme ça ... http://i.stack.imgur.com/nPBpx.png – cooldj

Questions connexes