private static RectangleF GetRect(FlexChart flexChart, Line line) { var start = AnnoPointToCoords(flexChart, line, line.Start); var end = AnnoPointToCoords(flexChart, line, line.End); var x = Math.Min(start.X, end.X); var y = Math.Min(start.Y, end.Y); var width = Math.Abs(start.X - end.X); var height = Math.Abs(start.Y - end.Y); SizeF contentSize = new SizeF(); if (!string.IsNullOrEmpty(line.Content)) { using (var g = flexChart.CreateGraphics()) { contentSize = g.MeasureString(line.Content, line.ContentStyle.Font); } } if (height == 0) //Horizontal line { height = line.Style.StrokeWidth + contentSize.Height; y = y - height; } else if (width == 0) //Vertical line { width = line.Style.StrokeWidth + contentSize.Height; } return(new RectangleF(x, y, width, height)); }
private bool LineHitTest(PointF pt, int minDist = 0) { var line = annotation as Line; var start = Helpers.AnnoPointToCoords(flexChart, line, line.Start); var end = Helpers.AnnoPointToCoords(flexChart, line, line.End); //Horizontal or Vertical lines if (start.X == end.X || start.Y == end.Y) { return(BoundingRectangle.Contains(pt)); } else { var lineWidth = line.Style.StrokeWidth; double textHeight = 0; if (!string.IsNullOrEmpty(line.Content)) { using (var g = flexChart.CreateGraphics()) { textHeight = g.MeasureString(line.Content, line.ContentStyle.Font).Height; } } return((-pt.X * (start.Y - end.Y) - (start.X * end.Y - end.X * start.Y)) / (end.X - start.X) - (minDist + lineWidth / 2 + textHeight) < pt.Y && pt.Y < (-pt.X * (start.Y - end.Y) - (start.X * end.Y - end.X * start.Y)) / (end.X - start.X) + (minDist + lineWidth / 2)); } }