Ejemplo n.º 1
0
 /// <summary>
 /// Called when DataSource property changed
 /// </summary>
 /// <param name="oldValue"></param>
 /// <param name="newValue"></param>
 protected override void OnDataSourceChanged(System.Collections.IEnumerable oldValue, System.Collections.IEnumerable newValue)
 {
     Segment = null;
     base.OnDataSourceChanged(oldValue, newValue);
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates the segments of SplineAreaSeries
        /// </summary>
        public override void CreateSegments()
        {
            int index = -1;

            double[] yCoef         = null;
            var      segmentPoints = new List <ChartPoint>();
            double   Origin        = this.ActualXAxis != null ? this.ActualXAxis.Origin : 0.0;

            if (ActualXAxis != null && ActualXAxis.Origin == 0 && ActualYAxis is LogarithmicAxis &&
                (ActualYAxis as LogarithmicAxis).Minimum != null)
            {
                Origin = (double)(ActualYAxis as LogarithmicAxis).Minimum;
            }
            List <double> xValues    = null;
            bool          isGrouping = this.ActualXAxis is CategoryAxis && !(this.ActualXAxis as CategoryAxis).IsIndexed;

            if (isGrouping)
            {
                xValues = GroupedXValuesIndexes;
            }
            else
            {
                xValues = GetXValues();
            }

            if (xValues != null && xValues.Count > 1)
            {
                if (isGrouping)
                {
                    Segments.Clear();
                    Adornments.Clear();

                    if (SplineType == SplineType.Monotonic)
                    {
                        GetMonotonicSpline(xValues, GroupedSeriesYValues[0]);
                    }
                    else if (SplineType == SplineType.Cardinal)
                    {
                        GetCardinalSpline(xValues, GroupedSeriesYValues[0]);
                    }
                    else
                    {
                        this.NaturalSpline(xValues, GroupedSeriesYValues[0], out yCoef);
                    }

                    ChartPoint initialPoint = new ChartPoint(xValues[0], Origin);
                    segmentPoints.Add(initialPoint);
                    initialPoint = new ChartPoint(xValues[0], double.IsNaN(GroupedSeriesYValues[0][0]) ? Origin : GroupedSeriesYValues[0][0]);
                    segmentPoints.Add(initialPoint);
                    for (int i = 0; i < xValues.Count; i++)
                    {
                        index = i + 1;
                        if (index < xValues.Count && index < GroupedSeriesYValues[0].Count)
                        {
                            ChartPoint startPoint = new ChartPoint(xValues[i], GroupedSeriesYValues[0][i]);
                            ChartPoint endPoint   = new ChartPoint(xValues[index], GroupedSeriesYValues[0][index]);
                            ChartPoint startControlPoint;
                            ChartPoint endControlPoint;

                            // Calculate curve points.
                            if (SplineType == SplineType.Monotonic)
                            {
                                startControlPoint = startControlPoints[index - 1];
                                endControlPoint   = endControlPoints[index - 1];
                            }
                            else if (SplineType == SplineType.Cardinal)
                            {
                                startControlPoint = startControlPoints[index - 1];
                                endControlPoint   = endControlPoints[index - 1];
                            }
                            else
                            {
                                GetBezierControlPoints(startPoint, endPoint, yCoef[i], yCoef[index], out startControlPoint, out endControlPoint);
                            }

                            segmentPoints.AddRange(new ChartPoint[] { startControlPoint, endControlPoint, endPoint });
                        }
                    }

                    if (Segment == null || Segments.Count == 0)
                    {
                        Segment = new SplineAreaSegment(segmentPoints, xValues, GroupedSeriesYValues[0], this);
                        Segments.Add(Segment);
                    }

                    if (AdornmentsInfo != null)
                    {
                        AddAreaAdornments(GroupedSeriesYValues[0]);
                    }
                }
                else
                {
                    ClearUnUsedAdornments(this.DataCount);
                    if (SplineType == SplineType.Monotonic)
                    {
                        GetMonotonicSpline(xValues, YValues);
                    }
                    else if (SplineType == SplineType.Cardinal)
                    {
                        GetCardinalSpline(xValues, YValues);
                    }
                    else
                    {
                        this.NaturalSpline(xValues, YValues, out yCoef);
                    }

                    ChartPoint initialPoint = new ChartPoint(xValues[0], Origin);
                    segmentPoints.Add(initialPoint);
                    initialPoint = new ChartPoint(xValues[0], double.IsNaN(YValues[0]) ? Origin : YValues[0]);
                    segmentPoints.Add(initialPoint);

                    for (int i = 0; i < DataCount; i++)
                    {
                        index = i + 1;
                        if (index < DataCount)
                        {
                            ChartPoint startPoint = new ChartPoint(xValues[i], YValues[i]);
                            ChartPoint endPoint   = new ChartPoint(xValues[index], YValues[index]);
                            ChartPoint startControlPoint;
                            ChartPoint endControlPoint;

                            // Calculate curve points.
                            if (SplineType == SplineType.Monotonic)
                            {
                                startControlPoint = startControlPoints[index - 1];
                                endControlPoint   = endControlPoints[index - 1];
                            }
                            else if (SplineType == SplineType.Cardinal)
                            {
                                startControlPoint = startControlPoints[index - 1];
                                endControlPoint   = endControlPoints[index - 1];
                            }
                            else
                            {
                                GetBezierControlPoints(startPoint, endPoint, yCoef[i], yCoef[index], out startControlPoint, out endControlPoint);
                            }

                            segmentPoints.AddRange(new ChartPoint[] { startControlPoint, endControlPoint, endPoint });
                        }
                    }

                    if (Segment == null || Segments.Count == 0)
                    {
                        Segment = new SplineAreaSegment(segmentPoints, xValues, YValues, this);
                        Segments.Add(Segment);
                    }
                    else
                    {
                        Segment.Item = ActualData;
                        (Segment as SplineAreaSegment).SetData(segmentPoints, xValues, YValues);
                    }

                    if (AdornmentsInfo != null)
                    {
                        AddAreaAdornments(YValues);
                    }
                }
            }
        }