示例#1
0
        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;
        }
示例#2
0
 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;
 }
示例#3
0
 /// <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);
        }
示例#5
0
        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));
        }
示例#6
0
        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"));
 }
示例#8
0
 /// <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));
 }