public static double FromDrawMargin(double value, AxisTags axis, Chart chart) { var o = axis == AxisTags.X ? chart.PlotArea.X : chart.PlotArea.Y; var of = axis == AxisTags.X ? chart.XOffset : chart.YOffset; return FromPlotArea(value, axis, chart) - o + of; }
public static double FromPlotArea(double value, AxisTags axis, Chart chart) { var p1 = axis == AxisTags.X ? new Point(chart.Max.X, chart.PlotArea.Width + chart.PlotArea.X) : new Point(chart.Max.Y, chart.PlotArea.Y); var p2 = axis == AxisTags.X ? new Point(chart.Min.X, chart.PlotArea.X) : new Point(chart.Min.Y, chart.PlotArea.Y + chart.PlotArea.Height); var m = (p2.Y - p1.Y) / (p2.X - p1.X); return (value + m*p1.X - p1.Y)/m; }
/// <summary> /// Scales a graph value to screen according to an axis. /// </summary> /// <param name="value"></param> /// <param name="axis"></param> /// <param name="chart"></param> /// <returns></returns> public static double ToPlotArea(double value, AxisTags axis, Chart chart) { //y = m (x - x1) + y1 var p1 = axis == AxisTags.X ? new Point(chart.Max.X, chart.PlotArea.Width + chart.PlotArea.X) : new Point(chart.Max.Y, chart.PlotArea.Y); var p2 = axis == AxisTags.X ? new Point(chart.Min.X, chart.PlotArea.X) : new Point(chart.Min.Y, chart.PlotArea.Y + chart.PlotArea.Height); var m = (p2.Y - p1.Y) / (p2.X - p1.X); return m * (value - p1.X) + p1.Y; }
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); }
public void Animate(int index, Chart chart, int pathOffset) { var s1 = new Point(); var s2 = new Point(); var s3 = new Point(); if (IsNew) { Bezier.Owner.Segments.Insert(index - pathOffset, Data.AssignTo(Bezier.Segment)); if (chart.Invert) { s1 = new Point(chart.ToDrawMargin(chart.Min.X, AxisTags.X), Data.P1.Y); s2 = new Point(chart.ToDrawMargin(chart.Min.X, AxisTags.X), Data.P2.Y); s3 = new Point(chart.ToDrawMargin(chart.Min.X, AxisTags.X), Data.P3.Y); } else { s1 = new Point(Data.P1.X, chart.ToDrawMargin(chart.Min.Y, AxisTags.Y)); s2 = new Point(Data.P2.X, chart.ToDrawMargin(chart.Min.Y, AxisTags.Y)); s3 = new Point(Data.P3.X, chart.ToDrawMargin(chart.Min.Y, AxisTags.Y)); } } var p1 = IsNew ? (Previous != null && !Previous.IsNew ? Previous.Bezier.Segment.Point3 : s1) : Bezier.Segment.Point1; var p2 = IsNew ? (Previous != null && !Previous.IsNew ? Previous.Bezier.Segment.Point3 : s2) : Bezier.Segment.Point2; var p3 = IsNew ? (Previous != null && !Previous.IsNew ? Previous.Bezier.Segment.Point3 : s3) : Bezier.Segment.Point3; if (chart.DisableAnimation) { Bezier.Segment.Point1 = Data.P1; Bezier.Segment.Point2 = Data.P2; Bezier.Segment.Point3 = Data.P3; return; } Bezier.Segment.BeginAnimation(BezierSegment.Point1Property, new PointAnimation(p1, Data.P1, LineSeries.AnimSpeed)); Bezier.Segment.BeginAnimation(BezierSegment.Point2Property, new PointAnimation(p2, Data.P2, LineSeries.AnimSpeed)); Bezier.Segment.BeginAnimation(BezierSegment.Point3Property, new PointAnimation(p3, Data.P3, LineSeries.AnimSpeed)); }
private void InitializeSeries(Chart chart) { #if DEBUG Trace.WriteLine("Chart was initialized (" + DateTime.Now.ToLongTimeString() + ")"); #endif chart.SeriesInitialized = true; foreach (var series in chart.Series) { var index = _colorIndexer++; series.Chart = chart; series.Collection = Series; series.Stroke = series.Stroke ?? new SolidColorBrush(Colors[(int) (index - Colors.Count*Math.Truncate(index/(decimal) Colors.Count))]); series.Fill = series.Fill ?? new SolidColorBrush(Colors[(int) (index - Colors.Count*Math.Truncate(index/(decimal) Colors.Count))]) { Opacity = DefaultFillOpacity }; series.RequiresPlot = true; series.RequiresAnimation = true; var observable = series.Values as INotifyCollectionChanged; if (observable != null) observable.CollectionChanged += chart.OnDataSeriesChanged; } chart.Update(); var anim = new DoubleAnimation { From = 0, To = 1, Duration = TimeSpan.FromMilliseconds(1000) }; if (!chart.DisableAnimation) chart.Canvas.BeginAnimation(OpacityProperty, anim); chart.Series.CollectionChanged += (sender, args) => { chart.SeriesChanged.Stop(); chart.SeriesChanged.Start(); if (args.Action == NotifyCollectionChangedAction.Reset) { chart.Canvas.Children.Clear(); chart.Shapes.Clear(); chart.ShapesMapper.Clear(); } if (args.OldItems != null) foreach (var series in args.OldItems.Cast<Series>()) chart.EraseSerieBuffer.Add(new DeleteBufferItem {Series = series, Force = true}); var newElements = args.NewItems != null ? args.NewItems.Cast<Series>() : new List<Series>(); chart.RequiresScale = true; foreach (var series in chart.Series.Where(x => !newElements.Contains(x))) { chart.EraseSerieBuffer.Add(new DeleteBufferItem {Series = series}); series.RequiresPlot = true; } if (args.NewItems != null) foreach (var series in newElements) { var index = _colorIndexer++; series.Chart = chart; series.Collection = Series; series.Stroke = series.Stroke ?? new SolidColorBrush(Colors[(int) (index - Colors.Count*Math.Truncate(index/(decimal) Colors.Count))]); series.Fill = series.Fill ?? new SolidColorBrush(Colors[(int) (index - Colors.Count*Math.Truncate(index/(decimal) Colors.Count))]) { Opacity = DefaultFillOpacity }; series.RequiresPlot = true; series.RequiresAnimation = true; var observable = series.Values as INotifyCollectionChanged; if (observable != null) observable.CollectionChanged += chart.OnDataSeriesChanged; #if DEBUG if (observable == null) Trace.WriteLine("series do not implements INotifyCollectionChanged"); #endif } }; }
private void Chart_OnPlot(Chart obj) { //MessageBox.Show((DateTime.Now - _time).TotalMilliseconds.ToString("N0")); }
/// <summary> /// Scales a graph point to screen. /// </summary> /// <param name="value"></param> /// <param name="chart"></param> /// <returns></returns> public static Point ToPlotArea(Point value, Chart chart) { return new Point(ToPlotArea(value.X, AxisTags.X, chart), ToPlotArea(value.Y, AxisTags.Y, chart)); }