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 Point GetPointCostData(DynamicStatistics.PlotPoints data, DynamicStatistics.PlotPoint point, long ticks)
        {
            var p0 = data[0];
            var px = ticks == 0 ? AxisOffset : AxisOffset + (ActualWidth - AxisOffset) * (point.Item2 - p0.Item2) / ticks;
            var py = (ActualHeight - AxisOffset) * (1 - Math.Min(1, point.Item1));

            return(Points.Get((int)px, (int)py));
        }
        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;
                }
            }
        }