public static List<Point> OptimizeForIndexedChart(this IEnumerable<Point> points, Chart chart) { var isFirst = true; var result = new List<Point>(); var ppp = chart.PerformanceConfiguration.PixelsPerPoint; double? x = null; var g = new List<Point>(); foreach (var point in points) { var chartValue = chart.ToPlotArea(point.X,AxisTags.X); if (x == null) x = chartValue; if (chartValue - x < ppp) { g.Add(point); continue; } //ToDo: Think about this: //average seems the best "general" method, but maybe a developer //should be able to choose the method. var xx = g.Average(p => p.X); if (isFirst) { xx = g.First().X; isFirst = false; } result.Add(new Point(xx, g.Average(p => p.Y))); g = new List<Point> {point}; x = chart.ToPlotArea(point.X, AxisTags.X); } result.Add(new Point(g.Last().X, g.Average(p => p.Y))); return result; }
private void Chart_OnPlot(Chart chart) { var sunPoint = chart.ToPlotArea(new Point(4, 35)); var snowPoint = chart.ToPlotArea(new Point(8, -3)); var notePoint = chart.ToPlotArea(new Point(1, 35)); Canvas.SetLeft(_sun, sunPoint.X - 20); Canvas.SetLeft(_snow, snowPoint.X - 20); Canvas.SetLeft(_note, notePoint.X); Canvas.SetTop(_sun, sunPoint.Y - 20); Canvas.SetTop(_snow, snowPoint.Y - 20); Canvas.SetTop(_note, notePoint.Y); }