/// <summary> /// Generate a GraphicsPath for Arrow markers. /// </summary> /// <param name="cardinal">Enum used to indicate which direction the marker should be pointed.</param> /// <param name="drawArea">Rectangle that defines the area the marker should be drawn within.</param> /// <param name="penSize">Thickness of the pen used, used to offset the marker slightly.</param> private GraphicsPath GetArrowPath(MarkerCardinal cardinal, Rectangle drawArea, float penSize) { var ArrowHead = _markerSize / 2f; var HalfSize = _markerSize / 2f; var Path = new GraphicsPath(); var Points = new List <PointF>(); var Offset = PointF.Empty; switch (cardinal) { case MarkerCardinal.Top: Offset = new PointF(0, -penSize); Points.Add(new PointF(drawArea.Left, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Bottom)); Points.Add(new PointF(drawArea.Right, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Top)); break; case MarkerCardinal.Bottom: Offset = new PointF(0, penSize); Points.Add(new PointF(drawArea.Left, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Top)); Points.Add(new PointF(drawArea.Right, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Bottom)); break; case MarkerCardinal.Right: Offset = new PointF(penSize, 0); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Top)); Points.Add(new PointF(drawArea.Left, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Bottom)); Points.Add(new PointF(drawArea.Right, drawArea.Top + HalfSize)); break; case MarkerCardinal.Left: default: Offset = new PointF(-penSize, 0); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Top)); Points.Add(new PointF(drawArea.Right, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Bottom)); Points.Add(new PointF(drawArea.Left, drawArea.Top + HalfSize)); break; } for (var i = 0; i < Points.Count; i++) { var Edit = Points[i]; Edit.X += Offset.X; Edit.Y += Offset.Y; Points[i] = Edit; } Path.AddLine(Points[0], Points[1]); Path.AddLine(Points[1], Points[2]); Path.AddLine(Points[2], Points[1]); Path.AddLine(Points[1], Points[3]); Points = null; return(Path); }
/// <summary> /// Generate a GraphicsPath for "V" markers. /// </summary> /// <param name="cardinal">Enum used to indicate which direction the marker should be pointed.</param> /// <param name="drawArea">Rectangle that defines the area the marker should be drawn within.</param> private GraphicsPath GetVeePath(MarkerCardinal cardinal, Rectangle drawArea) { var HalfSize = _markerSize / 2f; var Path = new GraphicsPath(); var Points = new List <PointF>(); switch (cardinal) { case MarkerCardinal.Top: drawArea.Offset((int)HalfSize, 0); Points.Add(new PointF(drawArea.Left - HalfSize, drawArea.Top)); Points.Add(new PointF(drawArea.Left, drawArea.Bottom)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Top)); break; case MarkerCardinal.Bottom: drawArea.Offset((int)HalfSize, 0); Points.Add(new PointF(drawArea.Left - HalfSize, drawArea.Bottom)); Points.Add(new PointF(drawArea.Left, drawArea.Top)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Bottom)); break; case MarkerCardinal.Right: drawArea.Offset(0, (int)HalfSize); Points.Add(new PointF(drawArea.Right, drawArea.Top - HalfSize)); Points.Add(new PointF(drawArea.Left, drawArea.Top)); Points.Add(new PointF(drawArea.Right, drawArea.Top + HalfSize)); break; case MarkerCardinal.Left: default: drawArea.Offset(0, (int)HalfSize); Points.Add(new PointF(drawArea.Left, drawArea.Top - HalfSize)); Points.Add(new PointF(drawArea.Right, drawArea.Top)); Points.Add(new PointF(drawArea.Left, drawArea.Top + HalfSize)); break; } Path.AddLine(Points[0], Points[1]); Path.AddLine(Points[1], Points[2]); Points = null; return(Path); }
/// <summary> /// Generate a GraphicsPath for Triangle markers. /// </summary> /// <param name="cardinal">Enum used to indicate which direction the marker should be pointed.</param> /// <param name="drawArea">Rectangle that defines the area the marker should be drawn within.</param> /// <param name="penSize">Thickness of the pen used, used to offset the marker slightly.</param> private GraphicsPath GetTrianglePath(MarkerCardinal cardinal, Rectangle drawArea) { var HalfSize = _markerSize / 2f; var Path = new GraphicsPath(); var Points = new List <PointF>(); switch (cardinal) { case MarkerCardinal.Top: Points.Add(new PointF(drawArea.Left, drawArea.Top)); Points.Add(new PointF(drawArea.Right, drawArea.Top)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Top + _markerSize)); break; case MarkerCardinal.Bottom: Points.Add(new PointF(drawArea.Left, drawArea.Bottom)); Points.Add(new PointF(drawArea.Left + HalfSize, drawArea.Top)); Points.Add(new PointF(drawArea.Right, drawArea.Bottom)); break; case MarkerCardinal.Right: Points.Add(new PointF(drawArea.Right, drawArea.Top)); Points.Add(new PointF(drawArea.Left, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Right, drawArea.Bottom)); break; case MarkerCardinal.Left: default: Points.Add(new PointF(drawArea.Left, drawArea.Top)); Points.Add(new PointF(drawArea.Right, drawArea.Top + HalfSize)); Points.Add(new PointF(drawArea.Left, drawArea.Bottom)); break; } Path.AddPolygon(Points.ToArray()); Points = null; return(Path); }