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