示例#1
0
        public override void Update()
        {
            var castedSeries = (IStackedRowSeriesViewView)View;

            const double padding = 5;

            var totalSpace      = ChartFunctions.GetUnitWidth(AxisTags.Y, Chart, View.ScalesYAt) - padding;
            var singleColHeigth = totalSpace;

            double exceed = 0;

            if (singleColHeigth > castedSeries.MaxRowHeigth)
            {
                exceed          = (singleColHeigth - castedSeries.MaxRowHeigth) / 2;
                singleColHeigth = castedSeries.MaxRowHeigth;
            }

            var relativeTop = padding + exceed;

            var startAt = CurrentXAxis.MinLimit >= 0 && CurrentXAxis.MaxLimit > 0
                ? CurrentXAxis.MinLimit
                : (CurrentXAxis.MinLimit < 0 && CurrentXAxis.MaxLimit <= 0
                    ? CurrentXAxis.MaxLimit
                    : 0);

            var zero = ChartFunctions.ToDrawMargin(startAt, AxisTags.X, Chart, View.ScalesXAt);

            foreach (var chartPoint in View.Values.Points)
            {
                var y    = ChartFunctions.ToDrawMargin(chartPoint.Y, AxisTags.Y, Chart, View.ScalesYAt) - ChartFunctions.GetUnitWidth(AxisTags.Y, Chart, View.ScalesYAt);
                var from = ChartFunctions.ToDrawMargin(chartPoint.From, AxisTags.X, Chart, View.ScalesXAt);
                var to   = ChartFunctions.ToDrawMargin(chartPoint.To, AxisTags.X, Chart, View.ScalesXAt);

                chartPoint.View = View.GetPointView(chartPoint.View, chartPoint,
                                                    View.DataLabels
                        ? (chartPoint.Participation > 0.05 ? View.LabelPoint(chartPoint) : string.Empty)
                        : null);

                chartPoint.SeriesView = View;

                var rectangleView = (IRectanglePointView)chartPoint.View;

                var w = Math.Abs(to - zero) - Math.Abs(from - zero);
                var l = to < zero
                    ? to
                    : from;

                rectangleView.Data.Height = singleColHeigth - padding;
                rectangleView.Data.Top    = y + relativeTop;

                rectangleView.Data.Left  = l;
                rectangleView.Data.Width = w;

                rectangleView.ZeroReference = zero;

                chartPoint.ChartLocation = new CorePoint(rectangleView.Data.Left + singleColHeigth / 2 - padding / 2, l);

                chartPoint.View.DrawOrMove(null, chartPoint, 0, Chart);
            }
        }
示例#2
0
        /// <summary>
        /// Ends the segment.
        /// </summary>
        /// <param name="atIndex">At index.</param>
        /// <param name="location">The location.</param>
        public virtual void EndSegment(int atIndex, CorePoint location)
        {
            var splitter = Splitters[ActiveSplitters - 1];

            var animSpeed = Model.Chart.View.AnimationsSpeed;
            var noAnim    = Model.Chart.View.DisableAnimations;

            var areaLimit = ChartFunctions.ToDrawMargin(double.IsNaN(AreaLimit)
                ? Model.Chart.AxisY[ScalesYAt].FirstSeparator
                : AreaLimit, AxisOrientation.Y, Model.Chart, ScalesYAt);

            var uw = Model.Chart.AxisX[ScalesXAt].EvaluatesUnitWidth
                ? ChartFunctions.GetUnitWidth(AxisOrientation.X, Model.Chart, ScalesXAt) / 2
                : 0;

            location.X -= uw;

            if (splitter.IsNew)
            {
                splitter.Right.Point = new Point(location.X, Model.Chart.DrawMargin.Height);
            }

            Figure.Segments.Remove(splitter.Right);
            if (noAnim)
            {
                splitter.Right.Point = new Point(location.X, areaLimit);
            }
            else
            {
                splitter.Right.BeginPointAnimation(nameof(LineSegment.Point), new Point(location.X, areaLimit), animSpeed);
            }
            Figure.Segments.Insert(atIndex, splitter.Right);

            splitter.IsNew = false;
        }
示例#3
0
        public override void Update()
        {
            ChartPoint previous = null;

            foreach (var current in View.ActualValues.GetPoints(View))
            {
                current.View = View.GetPointView(current.View, current,
                                                 View.DataLabels ? View.GetLabelPointFormatter()(current) : null);

                current.SeriesView = View;

                var stepView = (IStepPointView)current.View;

                current.ChartLocation = new CorePoint(
                    ChartFunctions.ToDrawMargin(current.X, AxisOrientation.X, Chart, View.ScalesXAt),
                    ChartFunctions.ToDrawMargin(current.Y, AxisOrientation.Y, Chart, View.ScalesYAt));

                if (previous != null)
                {
                    stepView.DeltaX = current.ChartLocation.X - previous.ChartLocation.X;
                    stepView.DeltaY = current.ChartLocation.Y - previous.ChartLocation.Y;
                }

                current.View.DrawOrMove(previous, current, 0, Chart);

                previous = current;
            }
        }
        public static List <IEnumerable <ChartPoint> > SelectedPoints(CartesianChart chart, Point p, out int axisBegin, out int axisEnd)
        {
            var beginning = new Point(ChartFunctions.FromPlotArea(origMouseDownPoint.X, AxisOrientation.X, chart.Model), ChartFunctions.FromPlotArea(origMouseDownPoint.Y, AxisOrientation.Y, chart.Model));
            var final     = new Point(ChartFunctions.FromPlotArea(p.X, AxisOrientation.X, chart.Model), ChartFunctions.FromPlotArea(p.Y, AxisOrientation.Y, chart.Model));

            List <IEnumerable <ChartPoint> > res = new List <IEnumerable <ChartPoint> >();
            var counter = 0;

            while (counter < chart.Series.Count)
            {
                var pts = chart.Series[counter].Values.GetPoints(chart.Series[0]).Where(pt => pt.X >= beginning.X && pt.X <= final.X);
                res.Add(pts);
                counter++;
            }

            try
            {
                axisBegin = chart.Series[0].Values.GetPoints(chart.Series[0]).Where(pt => pt.X >= beginning.X && pt.X <= final.X).First().Key;
                axisEnd   = chart.Series[0].Values.GetPoints(chart.Series[0]).Where(pt => pt.X >= beginning.X && pt.X <= final.X).Last().Key;
            }
            catch (Exception e)
            {
                axisBegin = -1;
                axisEnd   = -1;
            }
            return(res);
        }
示例#5
0
 private void OnDraggingStart(object sender, MouseButtonEventArgs e)
 {
     DragOrigin = e.GetPosition(this);
     DragOrigin = new Point(
         ChartFunctions.FromDrawMargin(DragOrigin.X, AxisTags.X, Model),
         ChartFunctions.FromDrawMargin(DragOrigin.Y, AxisTags.Y, Model));
 }
示例#6
0
        public void ZoomIn(CorePoint pivot)
        {
            if (AxisX == null || AxisY == null)
            {
                return;
            }

            View.HideTooltip();

            pivot = new CorePoint(
                ChartFunctions.FromPlotArea(pivot.X, AxisOrientation.X, this),
                ChartFunctions.FromPlotArea(pivot.Y, AxisOrientation.Y, this));

            var speed = View.ZoomingSpeed < 0.1 ? 0.1 : (View.ZoomingSpeed > 0.95 ? 0.95 : View.ZoomingSpeed);

            if (View.Zoom == ZoomingOptions.X || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var xi in AxisX)
                {
                    var max = xi.MaxValue ?? xi.TopLimit;
                    var min = xi.MinValue ?? xi.BotLimit;
                    var l   = max - min;

                    var rMin = (pivot.X - min) / l;
                    var rMax = 1 - rMin;

                    var target = l * speed;
                    if (target < xi.View.MinRange)
                    {
                        return;
                    }
                    var mint = pivot.X - target * rMin;
                    var maxt = pivot.X + target * rMax;
                    xi.View.SetRange(mint, maxt);
                }
            }

            if (View.Zoom == ZoomingOptions.Y || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var yi in AxisY)
                {
                    var max  = yi.MaxValue ?? yi.TopLimit;
                    var min  = yi.MinValue ?? yi.BotLimit;
                    var l    = max - min;
                    var rMin = (pivot.Y - min) / l;
                    var rMax = 1 - rMin;

                    var target = l * speed;
                    if (target < yi.View.MinRange)
                    {
                        return;
                    }
                    var mint = pivot.X - target * rMin;
                    var maxt = pivot.X + target * rMax;
                    yi.View.SetRange(mint, maxt);
                }
            }
        }
示例#7
0
        /// <summary>
        /// Zooms the out.
        /// </summary>
        /// <param name="pivot">The pivot.</param>
        public void ZoomOut(CorePoint pivot)
        {
            View.HideTooltip();

            var speed = View.ZoomingSpeed < 0.1 ? 0.1 : (View.ZoomingSpeed > 0.95 ? 0.95 : View.ZoomingSpeed);

            if (View.Zoom == ZoomingOptions.X || View.Zoom == ZoomingOptions.Xy)
            {
                for (var index = 0; index < AxisX.Count; index++)
                {
                    var xi = AxisX[index];

                    var px = ChartFunctions.FromPlotArea(pivot.X, AxisOrientation.X, this, index);

                    var max  = double.IsNaN(xi.View.MaxValue) ? xi.TopLimit : xi.View.MaxValue;
                    var min  = double.IsNaN(xi.View.MinValue) ? xi.BotLimit : xi.View.MinValue;
                    var l    = max - min;
                    var rMin = (px - min) / l;
                    var rMax = 1 - rMin;

                    var target = l * (1 / speed);
                    if (target > xi.View.MaxRange)
                    {
                        return;
                    }
                    var mint = px - target * rMin;
                    var maxt = px + target * rMax;
                    xi.View.SetRange(mint, maxt);
                }
            }

            if (View.Zoom == ZoomingOptions.Y || View.Zoom == ZoomingOptions.Xy)
            {
                for (var index = 0; index < AxisY.Count; index++)
                {
                    var ax = AxisY[index];

                    var py = ChartFunctions.FromPlotArea(pivot.Y, AxisOrientation.Y, this, index);

                    var max  = double.IsNaN(ax.View.MaxValue) ? ax.TopLimit : ax.View.MaxValue;
                    var min  = double.IsNaN(ax.View.MinValue) ? ax.BotLimit : ax.View.MinValue;
                    var l    = max - min;
                    var rMin = (py - min) / l;
                    var rMax = 1 - rMin;

                    var target = l * (1 / speed);
                    if (target > ax.View.MaxRange)
                    {
                        return;
                    }
                    var mint = py - target * rMin;
                    var maxt = py + target * rMax;
                    ax.View.SetRange(mint, maxt);
                }
            }
        }
示例#8
0
        public void ZoomIn(CorePoint pivot)
        {
            if (AxisX == null || AxisY == null)
            {
                return;
            }

            View.HideTooltop();

            pivot = new CorePoint(
                ChartFunctions.FromPlotArea(pivot.X, AxisOrientation.X, this),
                ChartFunctions.FromPlotArea(pivot.Y, AxisOrientation.Y, this));

            if (View.Zoom == ZoomingOptions.X || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var xi in AxisX)
                {
                    var max  = xi.MaxValue ?? xi.TopLimit;
                    var min  = xi.MinValue ?? xi.BotLimit;
                    var l    = max - min;
                    var rMin = (pivot.X - min) / l;
                    var rMax = 1 - rMin;

                    if ((max - rMax * xi.S) - (min + rMin * xi.S) < xi.S * .01)
                    {
                        return;
                    }

                    xi.View.MinValue = min + rMin * xi.S;
                    xi.View.MaxValue = max - rMax * xi.S;
                }
            }

            if (View.Zoom == ZoomingOptions.Y || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var yi in AxisY)
                {
                    var max  = yi.MaxValue ?? yi.TopLimit;
                    var min  = yi.MinValue ?? yi.BotLimit;
                    var l    = max - min;
                    var rMin = (pivot.Y - min) / l;
                    var rMax = 1 - rMin;

                    if ((max - rMax * yi.S) - (min + rMin * yi.S) < yi.S * .01)
                    {
                        return;
                    }

                    yi.View.MinValue = min + rMin * yi.S;
                    yi.View.MaxValue = max - rMax * yi.S;
                }
            }

            Updater.Run();
        }
示例#9
0
        private void OnDraggingStart(object sender, MouseButtonEventArgs e)
        {
            if (Model == null || Model.AxisX == null || Model.AxisY == null)
            {
                return;
            }

            DragOrigin = e.GetPosition(this);
            DragOrigin = new Point(
                ChartFunctions.FromDrawMargin(DragOrigin.X, AxisOrientation.X, Model),
                ChartFunctions.FromDrawMargin(DragOrigin.Y, AxisOrientation.Y, Model));
        }
示例#10
0
 protected virtual CorePoint GetStackedPoint(ChartPoint chartPoint)
 {
     if (_stackModelable.StackMode == StackMode.Values)
     {
         return(new CorePoint(
                    ChartFunctions.ToDrawMargin(chartPoint.X, AxisTags.X, Chart, View.ScalesXAt),
                    ChartFunctions.ToDrawMargin(chartPoint.To, AxisTags.Y, Chart, View.ScalesYAt)));
     }
     return(new CorePoint(
                ChartFunctions.ToDrawMargin(chartPoint.X, AxisTags.X, Chart, View.ScalesXAt),
                ChartFunctions.ToDrawMargin(chartPoint.StackedParticipation, AxisTags.Y, Chart, View.ScalesYAt)));
 }
示例#11
0
        public void ZoomOut(CorePoint pivot)
        {
            View.HideTooltip();

            pivot = new CorePoint(
                ChartFunctions.FromPlotArea(pivot.X, AxisOrientation.X, this),
                ChartFunctions.FromPlotArea(pivot.Y, AxisOrientation.Y, this));

            var speed = View.ZoomingSpeed < 0.1 ? 0.1 : (View.ZoomingSpeed > 0.95 ? 0.95 : View.ZoomingSpeed);

            if (View.Zoom == ZoomingOptions.X || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var xi in AxisX)
                {
                    var max  = double.IsNaN(xi.MaxValue) ? xi.TopLimit : xi.MaxValue;
                    var min  = double.IsNaN(xi.MinValue) ? xi.BotLimit : xi.MinValue;
                    var l    = max - min;
                    var rMin = (pivot.X - min) / l;
                    var rMax = 1 - rMin;

                    var target = l * (1 / speed);
                    if (target > xi.View.MaxRange)
                    {
                        return;
                    }
                    var mint = pivot.X - target * rMin;
                    var maxt = pivot.X + target * rMax;
                    xi.View.SetRange(mint, maxt);
                }
            }

            if (View.Zoom == ZoomingOptions.Y || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var yi in AxisY)
                {
                    var max  = double.IsNaN(yi.MaxValue) ? yi.TopLimit : yi.MaxValue;
                    var min  = double.IsNaN(yi.MinValue) ? yi.BotLimit : yi.MinValue;
                    var l    = max - min;
                    var rMin = (pivot.Y - min) / l;
                    var rMax = 1 - rMin;

                    var target = l * (1 / speed);
                    if (target > yi.View.MaxRange)
                    {
                        return;
                    }
                    var mint = pivot.X - target * rMin;
                    var maxt = pivot.X + target * rMax;
                    yi.View.SetRange(mint, maxt);
                }
            }
        }
        /// <summary>
        /// Gets the stacked point.
        /// </summary>
        /// <param name="chartPoint">The chart point.</param>
        /// <returns></returns>
        protected override CorePoint GetStackedPoint(ChartPoint chartPoint)
        {
            if (_stackModelable.StackMode == StackMode.Values)
            {
                return(new CorePoint(
                           ChartFunctions.ToDrawMargin(chartPoint.To, AxisOrientation.X, Chart, View.ScalesXAt),
                           ChartFunctions.ToDrawMargin(chartPoint.Y, AxisOrientation.Y, Chart, View.ScalesYAt)));
            }

            return(new CorePoint(
                       ChartFunctions.ToDrawMargin(chartPoint.StackedParticipation, AxisOrientation.X, Chart, View.ScalesXAt),
                       ChartFunctions.ToDrawMargin(chartPoint.Y, AxisOrientation.Y, Chart, View.ScalesYAt)));
        }
示例#13
0
        private void OnDraggingStart(object sender, PointerRoutedEventArgs e)
        {
            if (Model?.AxisX == null || Model.AxisY == null)
            {
                return;
            }

            DragOrigin = e.GetCurrentPoint(this).Position;
            DragOrigin = new Point(
                ChartFunctions.FromPlotArea(DragOrigin.X, AxisOrientation.X, Model),
                ChartFunctions.FromPlotArea(DragOrigin.Y, AxisOrientation.Y, Model));
            _isPanning = true;
        }
示例#14
0
        /// <summary>
        ///     Updates this instance.
        /// </summary>
        public override void Update()
        {
            var castedSeries = (IFinancialSeriesView)View;

            const double padding = 1.2;

            var totalSpace = ChartFunctions.GetUnitWidth(AxisOrientation.X, Chart, View.ScalesXAt) - padding;

            double exceed = 0;
            double candleWidth;

            if (totalSpace > castedSeries.MaxColumnWidth)
            {
                exceed      = totalSpace - castedSeries.MaxColumnWidth;
                candleWidth = castedSeries.MaxColumnWidth;
            }
            else
            {
                candleWidth = totalSpace;
            }

            ChartPoint previousDrawn = null;

            foreach (var chartPoint in View.ActualValues.GetPoints(View))
            {
                var x = ChartFunctions.ToDrawMargin(chartPoint.X, AxisOrientation.X, Chart, View.ScalesXAt);

                chartPoint.View = View.GetPointView(chartPoint,
                                                    View.DataLabels ? View.GetLabelPointFormatter()(chartPoint) : null);

                chartPoint.SeriesView = View;

                var candeView = (IOhlcPointView)chartPoint.View;

                candeView.Open  = ChartFunctions.ToDrawMargin(chartPoint.Open, AxisOrientation.Y, Chart, View.ScalesYAt);
                candeView.Close =
                    ChartFunctions.ToDrawMargin(chartPoint.Close, AxisOrientation.Y, Chart, View.ScalesYAt);
                candeView.High = ChartFunctions.ToDrawMargin(chartPoint.High, AxisOrientation.Y, Chart, View.ScalesYAt);
                candeView.Low  = ChartFunctions.ToDrawMargin(chartPoint.Low, AxisOrientation.Y, Chart, View.ScalesYAt);

                candeView.Width          = candleWidth - padding > 0 ? candleWidth - padding : 0;
                candeView.Left           = x + exceed / 2 + padding;
                candeView.StartReference = (candeView.High + candeView.Low) / 2;

                chartPoint.ChartLocation = new CorePoint(x + exceed / 2, (candeView.High + candeView.Low) / 2);

                chartPoint.View.DrawOrMove(previousDrawn, chartPoint, 0, Chart);

                previousDrawn = chartPoint;
            }
        }
示例#15
0
        private void UnanimatedPlace(IChartView chart, AxisTags direction, int axisIndex, Axis axis)
        {
            var i = ChartFunctions.ToPlotArea(Model.Value, direction, chart.Model, axisIndex);

            var uw = new CorePoint(
                axis.Model.EvaluatesUnitWidth
                    ? ChartFunctions.GetUnitWidth(AxisTags.X, chart.Model, axis.Model) / 2
                    : 0,
                axis.Model.EvaluatesUnitWidth
                    ? ChartFunctions.GetUnitWidth(AxisTags.Y, chart.Model, axis.Model) / 2
                    : 0);

            if (direction == AxisTags.Y)
            {
                Line.X1 = chart.Model.DrawMargin.Left;
                Line.X2 = chart.Model.DrawMargin.Left + chart.Model.DrawMargin.Width;
                Line.Y1 = i;
                Line.Y2 = i;

                var topM = axis.IsMerged
                    ? (i + TextBlock.ActualHeight > chart.Model.DrawMargin.Top + chart.Model.DrawMargin.Height
                        ? +TextBlock.ActualHeight
                        : 0)
                    : TextBlock.ActualHeight * .5;
                var leftM = axis.IsMerged ? TextBlock.ActualWidth + 10 : -2;
                Canvas.SetTop(TextBlock, i + uw.Y - topM);
                Canvas.SetLeft(TextBlock, axis.Position == AxisPosition.LeftBottom
                    ? axis.LabelsReference - TextBlock.ActualWidth + leftM
                    : axis.LabelsReference - leftM);
            }
            else
            {
                Line.X1 = i;
                Line.X2 = i;
                Line.Y1 = chart.Model.DrawMargin.Top;
                Line.Y2 = chart.Model.DrawMargin.Top + chart.Model.DrawMargin.Height;

                var left = axis.IsMerged
                    ? (i + TextBlock.ActualWidth > chart.Model.DrawMargin.Left + chart.Model.DrawMargin.Width
                        ? TextBlock.ActualWidth + 2
                        : -2)
                    : TextBlock.ActualWidth * .5;
                var top = axis.IsMerged ? TextBlock.ActualHeight : 0;
                Canvas.SetLeft(TextBlock, i + uw.X - left);
                Canvas.SetTop(TextBlock,
                              axis.Position == AxisPosition.LeftBottom
                        ? axis.LabelsReference - top
                        : axis.LabelsReference);
            }
        }
示例#16
0
        private void OnDraggingEnd(object sender, MouseButtonEventArgs e)
        {
            if (Zoom == ZoomingOptions.None)
            {
                return;
            }

            var end = e.GetPosition(this);

            end = new Point(
                ChartFunctions.FromDrawMargin(end.X, AxisOrientation.X, Model),
                ChartFunctions.FromDrawMargin(end.Y, AxisOrientation.Y, Model));

            Model.Drag(new CorePoint(DragOrigin.X - end.X, DragOrigin.Y - end.Y));
        }
示例#17
0
        public void ZoomOut(CorePoint pivot)
        {
            View.HideTooltop();

            if (IsZooming)
            {
                return;
            }

            RequestedZoomAt = DateTime.Now;

            var dataPivot = new CorePoint(
                ChartFunctions.FromDrawMargin(pivot.X, AxisOrientation.X, this),
                ChartFunctions.FromDrawMargin(pivot.Y, AxisOrientation.Y, this));

            if (View.Zoom == ZoomingOptions.X || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var xi in AxisX)
                {
                    var max  = xi.MaxValue ?? xi.TopLimit;
                    var min  = xi.MinValue ?? xi.BotLimit;
                    var l    = max - min;
                    var rMin = (dataPivot.X - min) / l;
                    var rMax = 1 - rMin;

                    xi.View.MinValue = min - rMin * xi.S;
                    xi.View.MaxValue = max + rMax * xi.S;
                }
            }

            if (View.Zoom == ZoomingOptions.Y || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var yi in AxisY)
                {
                    var max  = yi.MaxValue ?? yi.TopLimit;
                    var min  = yi.MinValue ?? yi.BotLimit;
                    var l    = max - min;
                    var rMin = (dataPivot.Y - min) / l;
                    var rMax = 1 - rMin;

                    yi.View.MinValue = min - rMin * yi.S;
                    yi.View.MaxValue = max + rMax * yi.S;
                }
            }

            Updater.Run(false, true);
        }
示例#18
0
        /// <summary>
        /// Drags the specified delta.
        /// </summary>
        /// <param name="delta">The delta.</param>
        public void Drag(CorePoint delta)
        {
            if (View.Pan == PanningOptions.Unset && View.Zoom == ZoomingOptions.None ||
                View.Pan == PanningOptions.None)
            {
                return;
            }

            var px = View.Pan == PanningOptions.Unset &&
                     (View.Zoom == ZoomingOptions.X || View.Zoom == ZoomingOptions.Xy);

            px = px || View.Pan == PanningOptions.X || View.Pan == PanningOptions.Xy;

            if (px)
            {
                for (var index = 0; index < AxisX.Count; index++)
                {
                    var xi = AxisX[index];
                    var dx = ChartFunctions.FromPlotArea(delta.X, AxisOrientation.X, this, index) -
                             ChartFunctions.FromPlotArea(0, AxisOrientation.X, this, index);

                    xi.View.SetRange((double.IsNaN(xi.View.MinValue) ? xi.BotLimit : xi.View.MinValue) + dx,
                                     (double.IsNaN(xi.View.MaxValue) ? xi.TopLimit : xi.View.MaxValue) + dx);
                }
            }

            var py = View.Pan == PanningOptions.Unset &&
                     (View.Zoom == ZoomingOptions.Y || View.Zoom == ZoomingOptions.Xy);

            py = py || View.Pan == PanningOptions.Y || View.Pan == PanningOptions.Xy;
            if (py)
            {
                for (var index = 0; index < AxisY.Count; index++)
                {
                    var ax = AxisY[index];
                    var dy = ChartFunctions.FromPlotArea(delta.Y, AxisOrientation.Y, this, index) -
                             ChartFunctions.FromPlotArea(0, AxisOrientation.Y, this, index);

                    ax.View.SetRange((double.IsNaN(ax.View.MinValue) ? ax.BotLimit : ax.View.MinValue) + dy,
                                     (double.IsNaN(ax.View.MaxValue) ? ax.TopLimit : ax.View.MaxValue) + dy);
                }
            }
        }
示例#19
0
        /// <summary>
        ///     Converts a chart values pair to pixels
        /// </summary>
        /// <param name="chart">Target chart</param>
        /// <param name="chartPoint">point in screen</param>
        /// <param name="axisX">axis x index</param>
        /// <param name="axisY">axis y index</param>
        /// <returns></returns>
        public static Point ConvertToPixels(this Chart chart, Point chartPoint, int axisX = 0, int axisY = 0)
        {
            if (chart.Model == null || chart.AxisX.Any(x => x.Model == null))
            {
                return(new Point());
            }

            var uw = new CorePoint(
                chart.AxisX[axisX].Model.EvaluatesUnitWidth
                    ? ChartFunctions.GetUnitWidth(AxisOrientation.X, chart.Model, axisX) / 2
                    : 0,
                chart.AxisY[axisY].Model.EvaluatesUnitWidth
                    ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, chart.Model, axisY) / 2
                    : 0);

            return(new Point(
                       ChartFunctions.ToPlotArea(chartPoint.X, AxisOrientation.X, chart.Model, axisX) + uw.X,
                       ChartFunctions.ToPlotArea(chartPoint.Y, AxisOrientation.Y, chart.Model, axisY) + uw.Y));
        }
        /// <summary>
        /// Updates this instance.
        /// </summary>
        public override void Update()
        {
            var bubbleSeries = (IScatterSeriesView)View;

            var p1 = new CorePoint();
            var p2 = new CorePoint();

            p1.X = Chart.WLimit.Max;
            p1.Y = bubbleSeries.MaxPointShapeDiameter;

            p2.X = Chart.WLimit.Min;
            p2.Y = bubbleSeries.MinPointShapeDiameter;

            var deltaX = p2.X - p1.X;
            // ReSharper disable once CompareOfFloatsByEqualityOperator
            var m = (p2.Y - p1.Y) / (deltaX == 0 ? double.MinValue : deltaX);

            var uw = new CorePoint(
                CurrentXAxis.EvaluatesUnitWidth
                        ? ChartFunctions.GetUnitWidth(AxisOrientation.X, Chart, View.ScalesXAt) / 2
                        : 0,
                CurrentYAxis.EvaluatesUnitWidth
                        ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, Chart, View.ScalesYAt) / 2
                        : 0);

            foreach (var chartPoint in View.ActualValues.GetPoints(View))
            {
                chartPoint.ChartLocation = ChartFunctions.ToDrawMargin(
                    chartPoint, View.ScalesXAt, View.ScalesYAt, Chart) + uw;

                chartPoint.SeriesView = View;

                chartPoint.View = View.GetPointView(chartPoint,
                                                    View.DataLabels ? View.GetLabelPointFormatter()(chartPoint) : null);

                var bubbleView = (IScatterPointView)chartPoint.View;

                bubbleView.Diameter = m * (chartPoint.Weight - p1.X) + p1.Y;

                chartPoint.View.DrawOrMove(null, chartPoint, 0, Chart);
            }
        }
示例#21
0
        public override void Update()
        {
            var castedSeries = (IOhlcSeriesView)View;

            const double padding = 5;

            var totalSpace = ChartFunctions.GetUnitWidth(AxisTags.X, Chart, View.ScalesXAt) - padding;

            double exceed      = 0;
            double candleWidth = 0;

            if (totalSpace > castedSeries.MaxColumnWidth)
            {
                exceed      = totalSpace - castedSeries.MaxColumnWidth;
                candleWidth = castedSeries.MaxColumnWidth;
            }

            foreach (var chartPoint in View.ActualValues.Points)
            {
                var x = ChartFunctions.ToDrawMargin(chartPoint.X, AxisTags.X, Chart, View.ScalesXAt);

                chartPoint.View = View.GetPointView(chartPoint.View, chartPoint,
                                                    View.DataLabels ? View.LabelPoint(chartPoint) : null);

                chartPoint.SeriesView = View;

                var ohclView = (IOhlcPointView)chartPoint.View;

                ohclView.Open  = ChartFunctions.ToDrawMargin(chartPoint.Open, AxisTags.Y, Chart, View.ScalesYAt);
                ohclView.Close = ChartFunctions.ToDrawMargin(chartPoint.Close, AxisTags.Y, Chart, View.ScalesYAt);
                ohclView.High  = ChartFunctions.ToDrawMargin(chartPoint.High, AxisTags.Y, Chart, View.ScalesYAt);
                ohclView.Low   = ChartFunctions.ToDrawMargin(chartPoint.Low, AxisTags.Y, Chart, View.ScalesYAt);

                ohclView.Width          = candleWidth - padding > 0 ? candleWidth - padding : 0;
                ohclView.Left           = x + exceed / 2;
                ohclView.StartReference = (ohclView.High + ohclView.Low) / 2;

                chartPoint.ChartLocation = new CorePoint(x + exceed / 2, (ohclView.High + ohclView.Low) / 2);

                chartPoint.View.DrawOrMove(null, chartPoint, 0, Chart);
            }
        }
示例#22
0
        private void OnDraggingEnd(object sender, PointerRoutedEventArgs e)
        {
            if (!_isPanning)
            {
                return;
            }
            if (Zoom == ZoomingOptions.None)
            {
                return;
            }

            var end = e.GetCurrentPoint(this).Position;

            end = new Point(
                ChartFunctions.FromPlotArea(end.X, AxisOrientation.X, Model),
                ChartFunctions.FromPlotArea(end.Y, AxisOrientation.Y, Model));

            Model.Drag(new CorePoint(DragOrigin.X - end.X, DragOrigin.Y - end.Y));
            _isPanning = false;
        }
示例#23
0
        public void ZoomOut(CorePoint pivot)
        {
            View.HideTooltop();

            var dataPivot = new CorePoint(
                ChartFunctions.FromPlotArea(pivot.X, AxisOrientation.X, this),
                ChartFunctions.FromPlotArea(pivot.Y, AxisOrientation.Y, this));

            if (View.Zoom == ZoomingOptions.X || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var xi in AxisX)
                {
                    var max  = xi.MaxValue ?? xi.TopLimit;
                    var min  = xi.MinValue ?? xi.BotLimit;
                    var l    = max - min;
                    var rMin = (dataPivot.X - min) / l;
                    var rMax = 1 - rMin;

                    xi.View.MinValue = min - rMin * xi.S;
                    xi.View.MaxValue = max + rMax * xi.S;
                }
            }

            if (View.Zoom == ZoomingOptions.Y || View.Zoom == ZoomingOptions.Xy)
            {
                foreach (var yi in AxisY)
                {
                    var max  = yi.MaxValue ?? yi.TopLimit;
                    var min  = yi.MinValue ?? yi.BotLimit;
                    var l    = max - min;
                    var rMin = (dataPivot.Y - min) / l;
                    var rMax = 1 - rMin;

                    yi.View.MinValue = min - rMin * yi.S;
                    yi.View.MaxValue = max + rMax * yi.S;
                }
            }

            Updater.Run();
        }
        /// <summary>
        /// Ends the segment.
        /// </summary>
        /// <param name="atIndex">At index.</param>
        /// <param name="location">The location.</param>
        public override void EndSegment(int atIndex, CorePoint location)
        {
            var splitter = Splitters[ActiveSplitters - 1];

            var animSpeed = Model.Chart.View.AnimationsSpeed;
            var noAnim    = Model.Chart.View.DisableAnimations;

            if (splitter.IsNew)
            {
                splitter.Right.Point = new Point(0, location.Y);
            }

            var areaLimit = 0d;

            if (!double.IsNaN(AreaLimit))
            {
                areaLimit = ChartFunctions.ToDrawMargin(AreaLimit, AxisOrientation.X, Model.Chart, ScalesXAt);
            }
            var uw = Model.Chart.AxisY[ScalesYAt].EvaluatesUnitWidth
                ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, Model.Chart, ScalesYAt) / 2
                : 0;

            location.Y += uw;

            Figure.Segments.Remove(splitter.Right);
            if (noAnim)
            {
                splitter.Right.Point = new Point(areaLimit, location.Y);
            }
            else
            {
                splitter.Right.BeginAnimation(LineSegment.PointProperty,
                                              new PointAnimation(new Point(areaLimit, location.Y), animSpeed));
            }
            Figure.Segments.Insert(atIndex, splitter.Right);

            splitter.IsNew = false;
        }
示例#25
0
        public override void Update()
        {
            var castedSeries = (IStackedRowSeriesView)View;

            var padding = castedSeries.RowPadding;

            var totalSpace      = ChartFunctions.GetUnitWidth(AxisOrientation.Y, Chart, View.ScalesYAt) - padding;
            var singleColHeigth = totalSpace;

            double exceed = 0;

            if (singleColHeigth > castedSeries.MaxRowHeight)
            {
                exceed          = (singleColHeigth - castedSeries.MaxRowHeight) / 2;
                singleColHeigth = castedSeries.MaxRowHeight;
            }

            var relativeTop = padding + exceed;

            var startAt = CurrentXAxis.BotLimit >= 0 && CurrentXAxis.TopLimit > 0
                ? CurrentXAxis.BotLimit
                : (CurrentXAxis.BotLimit < 0 && CurrentXAxis.TopLimit <= 0
                    ? CurrentXAxis.TopLimit
                    : 0);

            var zero = ChartFunctions.ToDrawMargin(startAt, AxisOrientation.X, Chart, View.ScalesXAt);

            foreach (var chartPoint in View.ActualValues.GetPoints(View))
            {
                var y    = ChartFunctions.ToDrawMargin(chartPoint.Y, AxisOrientation.Y, Chart, View.ScalesYAt) - ChartFunctions.GetUnitWidth(AxisOrientation.Y, Chart, View.ScalesYAt);
                var from = _stackModelable.StackMode == StackMode.Values
                    ? ChartFunctions.ToDrawMargin(chartPoint.From, AxisOrientation.X, Chart, View.ScalesXAt)
                    : ChartFunctions.ToDrawMargin(chartPoint.From / chartPoint.Sum, AxisOrientation.X, Chart, View.ScalesXAt);
                var to = _stackModelable.StackMode == StackMode.Values
                    ? ChartFunctions.ToDrawMargin(chartPoint.To, AxisOrientation.X, Chart, View.ScalesXAt)
                    : ChartFunctions.ToDrawMargin(chartPoint.To / chartPoint.Sum, AxisOrientation.X, Chart, View.ScalesXAt);

                chartPoint.View = View.GetPointView(chartPoint.View, chartPoint,
                                                    View.DataLabels
                        ? (chartPoint.Participation > 0.05
                            ? View.GetLabelPointFormatter()(chartPoint)
                            : string.Empty)
                        : null);

                chartPoint.SeriesView = View;

                var rectangleView = (IRectanglePointView)chartPoint.View;

                var w = Math.Abs(to - zero) - Math.Abs(from - zero);
                var l = to < zero
                    ? to
                    : from;

                rectangleView.Data.Height = singleColHeigth - padding;
                rectangleView.Data.Top    = y + relativeTop;

                rectangleView.Data.Left  = l;
                rectangleView.Data.Width = w;

                rectangleView.ZeroReference = zero;

                chartPoint.ChartLocation = new CorePoint(rectangleView.Data.Left + rectangleView.Data.Width,
                                                         rectangleView.Data.Top);

                chartPoint.View.DrawOrMove(null, chartPoint, 0, Chart);
            }
        }
示例#26
0
        public override void OnSeriesUpdateStart()
        {
            ActiveSplitters = 0;

            if (SplittersCollector == int.MaxValue - 1)
            {
                //just in case!
                Splitters.ForEach(s => s.SplitterCollectorIndex = 0);
                SplittersCollector = 0;
            }

            SplittersCollector++;

            if (Figure != null)
            {
                var xIni = ChartFunctions.ToDrawMargin(Values.Limit1.Min, AxisTags.X, Model.Chart, ScalesXAt);

                if (Model.Chart.View.DisableAnimations)
                {
                    Figure.StartPoint = new Point(xIni, Model.Chart.DrawMargin.Height);
                }
                else
                {
                    Figure.BeginAnimation(PathFigure.StartPointProperty,
                                          new PointAnimation(new Point(xIni, Model.Chart.DrawMargin.Height),
                                                             Model.Chart.View.AnimationsSpeed));
                }
            }

            if (IsInView)
            {
                return;
            }

            IsInView = true;

            Path = new Path();
            BindingOperations.SetBinding(Path, Shape.StrokeProperty,
                                         new Binding {
                Path = new PropertyPath(StrokeProperty), Source = this
            });
            BindingOperations.SetBinding(Path, Shape.FillProperty,
                                         new Binding {
                Path = new PropertyPath(FillProperty), Source = this
            });
            BindingOperations.SetBinding(Path, Shape.StrokeThicknessProperty,
                                         new Binding {
                Path = new PropertyPath(StrokeThicknessProperty), Source = this
            });
            BindingOperations.SetBinding(Path, VisibilityProperty,
                                         new Binding {
                Path = new PropertyPath(VisibilityProperty), Source = this
            });
            BindingOperations.SetBinding(Path, Shape.StrokeDashArrayProperty,
                                         new Binding {
                Path = new PropertyPath(StrokeDashArrayProperty), Source = this
            });
            var geometry = new PathGeometry();

            Figure = new PathFigure();
            geometry.Figures.Add(Figure);
            Path.Data = geometry;
            Model.Chart.View.AddToDrawMargin(Path);

            var x = ChartFunctions.ToDrawMargin(Values.Limit1.Min, AxisTags.X, Model.Chart, ScalesXAt);

            Figure.StartPoint = new Point(x, Model.Chart.DrawMargin.Height);

            var wpfChart = Model.Chart.View as Chart;

            if (wpfChart == null)
            {
                return;
            }

            var index = Stroke == null || Fill == null ? wpfChart.SeriesIndexCount++ : 0;

            var i = Model.Chart.View.Series.IndexOf(this);

            Panel.SetZIndex(Path, Model.Chart.View.Series.Count - i);

            if (Stroke == null)
            {
                SetValue(StrokeProperty, new SolidColorBrush(Chart.GetDefaultColor(index)));
            }
            if (Fill == null)
            {
                SetValue(FillProperty,
                         new SolidColorBrush(Chart.GetDefaultColor(index))
                {
                    Opacity = DefaultFillOpacity
                });
            }
        }
示例#27
0
        /// <summary>
        /// Calculates the components and margin.
        /// </summary>
        public void CalculateComponentsAndMargin()
        {
            var curSize = new CoreRectangle(0, 0, ControlSize.Width, ControlSize.Height);

            curSize = PlaceLegend(curSize);

            const double padding = 4;

            for (int index = 0; index < AxisY.Count; index++)
            {
                var ax        = AxisY[index];
                var titleSize = ax.View.UpdateTitle(this, -90d);
                var biggest   = ax.PrepareChart(AxisOrientation.Y, this);

                var x = curSize.Left;

                if (ax.Position == AxisPosition.LeftBottom)
                {
                    ax.View.SetTitleLeft(x);
                    curSize.Left  += titleSize.Height + biggest.Width + padding;
                    curSize.Width -= (titleSize.Height + biggest.Width + padding);
                    ax.Tab         = curSize.Left;
                }
                else
                {
                    ax.View.SetTitleLeft(x + curSize.Width - titleSize.Height);
                    curSize.Width -= (titleSize.Height + biggest.Width + padding);
                    ax.Tab         = curSize.Left + curSize.Width;
                }

                var uw = ax.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.Y, this, index) / 2 : 0;

                var topE = biggest.Top - uw;
                if (topE > curSize.Top)
                {
                    var dif = topE - curSize.Top;
                    curSize.Top    += dif;
                    curSize.Height -= dif;
                }

                var botE = biggest.Bottom - uw;
                if (botE > ControlSize.Height - (curSize.Top + curSize.Height))
                {
                    var dif = botE - (ControlSize.Height - (curSize.Top + curSize.Height));
                    curSize.Height -= dif;
                }
            }

            for (var index = 0; index < AxisX.Count; index++)
            {
                var xi        = AxisX[index];
                var titleSize = xi.View.UpdateTitle(this);
                var biggest   = xi.PrepareChart(AxisOrientation.X, this);
                var top       = curSize.Top;

                if (xi.Position == AxisPosition.LeftBottom)
                {
                    xi.View.SetTitleTop(top + curSize.Height - titleSize.Height);
                    curSize.Height -= (titleSize.Height + biggest.Height);
                    xi.Tab          = curSize.Top + curSize.Height;
                }
                else
                {
                    xi.View.SetTitleTop(top);
                    curSize.Top    += titleSize.Height + biggest.Height;
                    curSize.Height -= (titleSize.Height + biggest.Height);
                    xi.Tab          = curSize.Top;
                }

                //Notice the unit width is not exact at this point...
                var uw = xi.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(AxisOrientation.X, this, index) / 2 : 0;

                var leftE = biggest.Left - uw > 0 ? biggest.Left - uw : 0;
                if (leftE > curSize.Left)
                {
                    var dif = leftE - curSize.Left;
                    curSize.Left  += dif;
                    curSize.Width -= dif;
                    foreach (var correctedAxis in AxisY
                             .Where(correctedAxis => correctedAxis.Position == AxisPosition.LeftBottom))
                    {
                        correctedAxis.Tab += dif;
                    }
                }

                var rightE = biggest.Right - uw > 0 ? biggest.Right - uw : 0;
                if (rightE > ControlSize.Width - (curSize.Left + curSize.Width))
                {
                    var dif = rightE - (ControlSize.Width - (curSize.Left + curSize.Width));
                    curSize.Width -= dif;
                    foreach (var correctedAxis in AxisY
                             .Where(correctedAxis => correctedAxis.Position == AxisPosition.RightTop))
                    {
                        correctedAxis.Tab -= dif;
                    }
                }
            }

            DrawMargin.Top    = curSize.Top;
            DrawMargin.Left   = curSize.Left;
            DrawMargin.Width  = curSize.Width;
            DrawMargin.Height = curSize.Height;

            for (var index = 0; index < AxisY.Count; index++)
            {
                var ax = AxisY[index];
                var pr = ChartFunctions.FromPlotArea(ax.MaxPointRadius, AxisOrientation.Y, this, index) -
                         ChartFunctions.FromPlotArea(0, AxisOrientation.Y, this, index);
                if (!double.IsNaN(pr))
                {
                    ax.BotLimit += pr;
                    ax.TopLimit -= pr;
                }
                ax.UpdateSeparators(AxisOrientation.Y, this, index);
                ax.View.SetTitleTop(curSize.Top + curSize.Height * .5 + ax.View.GetLabelSize().Width *.5);
            }

            for (var index = 0; index < AxisX.Count; index++)
            {
                var xi = AxisX[index];
                var pr = ChartFunctions.FromPlotArea(xi.MaxPointRadius, AxisOrientation.X, this, index) -
                         ChartFunctions.FromPlotArea(0, AxisOrientation.X, this, index);
                if (!double.IsNaN(pr))
                {
                    xi.BotLimit -= pr;
                    xi.TopLimit += pr;
                }
                xi.UpdateSeparators(AxisOrientation.X, this, index);
                xi.View.SetTitleLeft(curSize.Left + curSize.Width * .5 - xi.View.GetLabelSize().Width *.5);
            }
        }
示例#28
0
        public void DrawOrMove(AxisOrientation source, int axis)
        {
            _rectangle.Fill            = Fill;
            _rectangle.Stroke          = Stroke;
            _rectangle.StrokeDashArray = StrokeDashArray;
            _rectangle.StrokeThickness = StrokeThickness;
            Panel.SetZIndex(_rectangle, Panel.GetZIndex(this));

            if (Parent == null)
            {
                Model.Chart.View.AddToView(this);
                Model.Chart.View.AddToDrawMargin(_rectangle);
                Model.Chart.View.AddToDrawMargin(_label);
                _rectangle.Height = 0;
                _rectangle.Width  = 0;
                Canvas.SetLeft(_rectangle, 0d);
                Canvas.SetTop(_rectangle, Model.Chart.DrawMargin.Height);
                Canvas.SetTop(_label, Model.Chart.DrawMargin.Height);
                Canvas.SetLeft(_label, 0d);
            }

            var ax = source == AxisOrientation.X ? Model.Chart.AxisX[axis] : Model.Chart.AxisY[axis];
            var uw = ax.EvaluatesUnitWidth ? ChartFunctions.GetUnitWidth(source, Model.Chart, axis) / 2 : 0;

            var from = ChartFunctions.ToDrawMargin(FromValue, source, Model.Chart, axis) + uw;
            var to   = ChartFunctions.ToDrawMargin(ToValue, source, Model.Chart, axis) + uw;

            if (from > to)
            {
                var temp = to;
                to   = from;
                from = temp;
            }

            var anSpeed = Model.Chart.View.AnimationsSpeed;

            _label.UpdateLayout();

            if (source == AxisOrientation.X)
            {
                var w = to - from;
                w = StrokeThickness > w ? StrokeThickness : w;

                Canvas.SetTop(_rectangle, 0);
                _rectangle.Height = Model.Chart.DrawMargin.Height;

                if (Model.Chart.View.DisableAnimations)
                {
                    _rectangle.Width = w > 0 ? w : 0;
                    Canvas.SetLeft(_rectangle, from - StrokeThickness / 2);
                    Canvas.SetLeft(_label, (from + to) / 2 - _label.ActualWidth / 2);
                }
                else
                {
                    _rectangle.BeginAnimation(WidthProperty, new DoubleAnimation(w > 0 ? w : 0, anSpeed));
                    _rectangle.BeginAnimation(Canvas.LeftProperty, new DoubleAnimation(from - StrokeThickness / 2, anSpeed));
                    _label.BeginAnimation(Canvas.LeftProperty,
                                          new DoubleAnimation((from + to) / 2 - _label.ActualWidth / 2, anSpeed));
                }
                return;
            }

            var h = to - from;

            h = StrokeThickness > h ? StrokeThickness : h;

            Canvas.SetLeft(_rectangle, 0d);
            _rectangle.Width = Model.Chart.DrawMargin.Width;

            if (Model.Chart.View.DisableAnimations)
            {
                Canvas.SetTop(_rectangle, from - StrokeThickness / 2);
                _rectangle.Height = h > 0 ? h : 0;
                Canvas.SetTop(_label, (from + to) / 2 - _label.ActualHeight / 2);
            }
            else
            {
                _rectangle.BeginAnimation(Canvas.TopProperty, new DoubleAnimation(from, anSpeed));
                _rectangle.BeginAnimation(HeightProperty, new DoubleAnimation(h, anSpeed));
                _label.BeginAnimation(Canvas.TopProperty,
                                      new DoubleAnimation((from + to) / 2 - _label.ActualHeight / 2, anSpeed));
            }
        }
        /// <summary>
        /// Updates this instance.
        /// </summary>
        public override void Update()
        {
            var castedSeries = (IRowSeriesView)View;

            var padding = castedSeries.RowPadding;

            var totalSpace = ChartFunctions.GetUnitWidth(AxisOrientation.Y, Chart, View.ScalesYAt) - padding;
            var typeSeries = Chart.View.ActualSeries.OfType <IRowSeriesView>().ToList();

            var singleRowHeight = totalSpace / typeSeries.Count;

            double exceed = 0;

            var seriesPosition = typeSeries.IndexOf((IRowSeriesView)View);

            if (singleRowHeight > castedSeries.MaxRowHeigth)
            {
                exceed          = (singleRowHeight - castedSeries.MaxRowHeigth) * typeSeries.Count / 2;
                singleRowHeight = castedSeries.MaxRowHeigth;
            }

            var relativeTop = padding + exceed + singleRowHeight * (seriesPosition);

            var startAt = CurrentXAxis.BotLimit >= 0 && CurrentXAxis.TopLimit > 0   //both positive
                ? CurrentXAxis.BotLimit                                             //then use Min
                : (CurrentXAxis.BotLimit < 0 && CurrentXAxis.TopLimit <= 0          //both negative
                    ? CurrentXAxis.TopLimit                                         //then use Max
                    : 0);                                                           //if mixed then use 0

            var zero = ChartFunctions.ToDrawMargin(startAt, AxisOrientation.X, Chart, View.ScalesXAt);

            var correction = ChartFunctions.GetUnitWidth(AxisOrientation.Y, Chart, View.ScalesYAt);

            foreach (var chartPoint in View.ActualValues.GetPoints(View))
            {
                var reference =
                    ChartFunctions.ToDrawMargin(chartPoint, View.ScalesXAt, View.ScalesYAt, Chart);

                chartPoint.View = View.GetPointView(chartPoint,
                                                    View.DataLabels ? View.GetLabelPointFormatter()(chartPoint) : null);

                chartPoint.SeriesView = View;

                var rectangleView = (IRectanglePointView)chartPoint.View;

                var w = Math.Abs(reference.X - zero);
                var l = reference.X < zero
                    ? reference.X
                    : zero;


                if (chartPoint.EvaluatesGantt)
                {
                    l = ChartFunctions.ToDrawMargin(chartPoint.XStart, AxisOrientation.X, Chart, View.ScalesXAt);
                    if (!(reference.X < zero && l < zero))
                    {
                        w -= l;
                    }
                }

                rectangleView.Data.Height = singleRowHeight - padding;
                rectangleView.Data.Top    = reference.Y + relativeTop - correction;

                rectangleView.Data.Left  = l;
                rectangleView.Data.Width = w;

                rectangleView.ZeroReference = zero;

                chartPoint.ChartLocation = new CorePoint(rectangleView.Data.Left + rectangleView.Data.Width,
                                                         rectangleView.Data.Top);

                chartPoint.View.DrawOrMove(null, chartPoint, 0, Chart);
            }
        }
示例#30
0
        public override void Update()
        {
            var heatSeries = (IHeatSeriesView)View;

            var uw = new CorePoint(
                0 * ChartFunctions.GetUnitWidth(AxisOrientation.X, Chart, View.ScalesXAt) / 2,
                -ChartFunctions.GetUnitWidth(AxisOrientation.Y, Chart, View.ScalesYAt));

            // ReSharper disable once CompareOfFloatsByEqualityOperator
            var wd = CurrentXAxis.TopLimit - CurrentXAxis.BotLimit == 0
                ? double.MaxValue
                : CurrentXAxis.TopLimit - CurrentXAxis.BotLimit;
            // ReSharper disable once CompareOfFloatsByEqualityOperator
            var hd = CurrentYAxis.TopLimit - CurrentYAxis.BotLimit == 0
                ? double.MaxValue
                : CurrentYAxis.TopLimit - CurrentYAxis.BotLimit;
            var w = Chart.DrawMargin.Width / wd;
            var h = Chart.DrawMargin.Height / hd;

            //lets force the gradients to always have an 'interpol-able' model

            if (!heatSeries.Stops.Any())
            {
                throw new LiveChartsException("There is no a valid gradient to create a heat series.");
            }

            var correctedGradients = heatSeries.Stops.Select(x => new CoreGradientStop
            {
                Color  = x.Color,
                Offset = x.Offset < 0 ? 0 : (x.Offset > 1 ? 1 : x.Offset)
            }).ToList();
            var min = correctedGradients[0];

            min.Offset = 0;
            correctedGradients.Insert(0, min);
            var max = correctedGradients[correctedGradients.Count - 1];

            max.Offset = 1;
            correctedGradients.Add(max);

            foreach (var chartPoint in View.ActualValues.GetPoints(View))
            {
                chartPoint.ChartLocation = ChartFunctions.ToDrawMargin(
                    chartPoint, View.ScalesXAt, View.ScalesYAt, Chart) + uw;

                chartPoint.SeriesView = View;

                chartPoint.View = View.GetPointView(chartPoint.View, chartPoint,
                                                    View.DataLabels ? View.GetLabelPointFormatter()(chartPoint) : null);

                var heatView = (IHeatPointView)chartPoint.View;

                heatView.ColorComponents = ColorInterpolation(correctedGradients,
                                                              chartPoint.Weight / Chart.Value3CoreLimit.Max);

                heatView.Width  = w;
                heatView.Height = h;

                chartPoint.View.DrawOrMove(null, chartPoint, 0, Chart);
            }
        }