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); } }
/// <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; }
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); }
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)); }
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); } } }
/// <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); } } }
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(); }
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)); }
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))); }
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))); }
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; }
/// <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; } }
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); } }
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)); }
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); }
/// <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); } } }
/// <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); } }
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); } }
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; }
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; }
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); } }
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 }); } }
/// <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); } }
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); } }
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); } }