private void DrawLabel(DynamicStatistics.PlotPoints data, Color color) { var text = new FormattedText(TimeSpan.FromTicks(data.Last().Item2 - data[0].Item2).ToString(@"hh\:mm\:ss") + " / " + Converter.DoubleToText(data.Last().Item1, "N6", false) + " %", Culture.Current, FlowDirection.LeftToRight, Font, 10, Tools.Draw.GetBrush(color), Render.PixelsPerDip); CtlPresenter.DrawRectangle(Tools.Draw.GetBrush(Tools.Draw.GetColor(150, Colors.White)), null, Rects.Get((ActualWidth - AxisOffset - text.Width) / 2 - 5, ActualHeight - AxisOffset - 20, text.Width + 10, text.Height)); CtlPresenter.DrawText(text, Points.Get((ActualWidth - AxisOffset - text.Width) / 2, ActualHeight - AxisOffset - 20)); }
private void Vanish(DynamicStatistics.PlotPoints data, PointFunc func) { const int vanishArea = 14; const int minPointsCount = 10; while (true) { if (data.Count <= minPointsCount) { return; } var pointsToRemove = new List <DynamicStatistics.PlotPoint>(); for (int i = 0; i < data.Count - minPointsCount /*minPointsCount*/; ++i) { var ticks = data.Last().Item2 - data[0].Item2; var p0 = func(data, data[i], ticks); var p1 = func(data, data[i + 1], ticks); var p2 = func(data, data[i + 2], ticks); if (Math.Abs(Angle(p0, p1) - Angle(p1, p2)) < Math.PI / 720D) // 90 { pointsToRemove.Add(data[i + 1]); if (data.Count - pointsToRemove.Count < minPointsCount) { break; } i += 2; } else { if (Math.Abs(p0.X - p1.X) < vanishArea && Math.Abs(p0.Y - p1.Y) < vanishArea) { pointsToRemove.Add(data[i + 1]); if (data.Count - pointsToRemove.Count < minPointsCount) { break; } i += 2; } } } if (!pointsToRemove.Any()) { return; } pointsToRemove.ForEach(p => data.Remove(p)); } }
private void DrawData(DynamicStatistics.PlotPoints data, Color color, PointFunc func, bool isRect) { if (data == null || data.FirstOrDefault() == null) { return; } var pen = Tools.Draw.GetPen(color); var firstData = data[0]; var lastData = data.Last(); var ticks = lastData.Item2 - firstData.Item2; Point prevPoint = new Point(-1000, -1000); var prevData = firstData; foreach (var d in data) { var point = func(data, d, ticks); if ((point.X - prevPoint.X) > 10 || Math.Abs(point.Y - prevPoint.Y) > 10 || d == lastData) // opt { CtlPresenter.DrawLine(pen, func(data, prevData, ticks), point); if (isRect) { CtlPresenter.DrawRectangle(pen.Brush, pen, Rects.Get(point.X - 6 / 2, point.Y - 6 / 2, 6, 6)); } else { CtlPresenter.DrawEllipse(pen.Brush, pen, Points.Get(point.X, point.Y), 7 / 2, 7 / 2); } prevData = d; prevPoint = point; } } }