void TransformToScreenCo(ChartTransform.ChartCartesianTransformer cartesianTransformer)
        {
            int    i            = 0;
            bool   x_isInversed = cartesianTransformer.XAxis.IsInversed;
            bool   y_isInversed = cartesianTransformer.YAxis.IsInversed;
            double xStart       = cartesianTransformer.XAxis.VisibleRange.Start;
            double xEnd         = cartesianTransformer.XAxis.VisibleRange.End;
            double yStart       = cartesianTransformer.YAxis.VisibleRange.Start;
            double yEnd         = cartesianTransformer.YAxis.VisibleRange.End;
            double xDelta       = x_isInversed ? xStart - xEnd : xEnd - xStart;
            double yDelta       = y_isInversed ? yStart - yEnd : yEnd - yStart;

            double width  = cartesianTransformer.XAxis.RenderedRect.Width;
            double height = cartesianTransformer.YAxis.RenderedRect.Height;

            availableSize = new Size(width, height);

            double xTolerance = Math.Abs((xDelta * 1) / availableSize.Width);
            double yTolerance = Math.Abs((yDelta * 1) / availableSize.Height);
            double left       = cartesianTransformer.XAxis.RenderedRect.Left - fastSeries.Area.SeriesClipRect.Left;
            double top        = cartesianTransformer.YAxis.RenderedRect.Top - fastSeries.Area.SeriesClipRect.Top;
            int    count      = (int)(Math.Ceiling(xEnd));
            int    start      = (int)(Math.Floor(xStart));

            if (x_isInversed)
            {
                double temp = xStart;
                xStart = xEnd;
                xEnd   = temp;
            }

            if (y_isInversed)
            {
                double temp = yStart;
                yStart = yEnd;
                yEnd   = temp;
            }
            if (RenderingMode == RenderingMode.Default)
            {
                Points = new PointCollection();
                double xValue     = 0;
                double yValue     = 0;
                double prevXValue = 0;
                double prevYValue = 0;

                if (fastSeries.IsIndexed)
                {
                    int length = Length - 1;
                    start = start > length ? start : length;
                    start = start < 0 ? 0 : start;
                    count = count > yChartVals.Count ? yChartVals.Count : count;
                    for (i = start; i <= count; i++)
                    {
                        double xVal = 0;
                        double yVal = 0;
                        if (i >= 0 && i < yChartVals.Count)
                        {
                            xVal = xChartVals[i];
                            yVal = yChartVals[i];
                        }
                        else
                        {
                            continue;
                        }
                        if (Math.Abs(prevXValue - i) >= xTolerance || Math.Abs(prevYValue - yVal) >= yTolerance)
                        {
                            if (xVal <= xEnd && xVal >= xStart)
                            {
                                xValue = left + (availableSize.Width * ((i - xStart) / xDelta));
                                yValue = top + (availableSize.Height * (1 - ((yVal - yStart) / yDelta)));
                                Points.Add(new Point(xValue, yValue));
                            }

                            else if (xVal < xStart && i + 1 < yChartVals.Count)
                            {
                                double y = ChartMath.GetInterpolarationPoint(xChartVals[i], xChartVals[i + 1], yVal, yChartVals[i + 1], xStart);

                                xValue = left;
                                yValue = top + (availableSize.Height * (1 - ((y - yStart) / yDelta)));
                                Points.Add(new Point(xValue, yValue));
                            }
                            else if (xVal > xEnd && i - 1 > 0)
                            {
                                double y = ChartMath.GetInterpolarationPoint(xChartVals[i - 1], xChartVals[i], yChartVals[i - 1], yVal, xEnd);

                                xValue = left + availableSize.Width;
                                yValue = top + (availableSize.Height * (1 - ((y - yStart) / yDelta)));
                                Points.Add(new Point(xValue, yValue));
                            }

                            prevXValue = i;
                            prevYValue = yVal;
                        }
                    }
                }
                else
                {
                    int startIndex = 0;
                    for (i = Length - 1; i < xChartVals.Count; i++)
                    {
                        double xVal = xChartVals[i];
                        double yVal = yChartVals[i];

                        if (Math.Abs(prevXValue - xVal) >= xTolerance || Math.Abs(prevYValue - yVal) >= yTolerance)
                        {
                            if ((xVal <= xEnd) && (xVal >= xStart))
                            {
                                xValue = left + (availableSize.Width * ((xVal - xStart) / xDelta));
                                yValue = top + (availableSize.Height * (1 - ((yVal - yStart) / yDelta)));
                                Points.Add(new Point(xValue, yValue));
                            }

                            else if (xVal < xStart)
                            {
                                startIndex = i;
                            }
                            else if (xVal > xEnd)
                            {
                                if (i - 1 > -1)
                                {
                                    double y = ChartMath.GetInterpolarationPoint(xChartVals[i - 1], xChartVals[i], yChartVals[i - 1], yVal, xEnd);

                                    xValue = left + availableSize.Width;
                                    yValue = top + (availableSize.Height * (1 - ((y - yStart) / yDelta)));
                                    Points.Add(new Point(xValue, yValue));
                                    break;
                                }
                            }
                        }
                        prevXValue = xVal;
                        prevYValue = yVal;
                    }

                    if (startIndex > 0)
                    {
                        if (startIndex + 1 < xChartVals.Count)
                        {
                            double y = ChartMath.GetInterpolarationPoint(xChartVals[startIndex], xChartVals[startIndex + 1], yChartVals[startIndex], yChartVals[startIndex + 1], xStart);

                            xValue = left;
                            yValue = top + (availableSize.Height * (1 - ((y - yStart) / yDelta)));
                            Points.Insert(0, new Point(xValue, yValue));
                        }
                    }
                }
            }
            else
            {
                xValues.Clear();
                yValues.Clear();
                double prevXValue = 0;
                double prevYValue = 0;
                float  xValue     = 0;
                float  yValue     = 0;
                if (fastSeries.IsIndexed)
                {
                    prevXValue = 1;
                    for (i = start; i <= count; i++)
                    {
                        double yVal = yChartVals[i];

                        if (Math.Abs(prevXValue - i) >= xTolerance || Math.Abs(prevYValue - yVal) >= yTolerance)
                        {
                            xValue = (float)(left + availableSize.Width * ((i - xStart) / xDelta));
                            yValue = (float)(top + availableSize.Height * (1 - ((yVal - yStart) / yDelta)));
                            xValues.Add(xValue);
                            yValues.Add(yValue);
                            prevXValue = i;
                            prevYValue = yVal;
                        }
                    }

                    if (start > 0)
                    {
                        i = start - 1;
                        double yVal = yChartVals[i];
                        xValue = (float)(left + availableSize.Width * ((i - xStart) / xDelta));
                        yValue = (float)(top + availableSize.Height * (1 - ((yVal - yStart) / yDelta)));
                        xValues.Insert(0, xValue);
                        yValues.Insert(0, yValue);
                    }

                    if (count < yChartVals.Count - 1)
                    {
                        i = count + 1;
                        double yVal = yChartVals[i];
                        xValue = (float)(left + availableSize.Width * ((i - xStart) / xDelta));
                        yValue = (float)(top + availableSize.Height * (1 - ((yVal - yStart) / yDelta)));
                        xValues.Add(xValue);
                        yValues.Add(yValue);
                    }
                }
                else
                {
                    int startIndex = 0;
                    for (i = Length - 1; i < xChartVals.Count; i++)
                    {
                        double xVal = xChartVals[i];
                        double yVal = yChartVals[i];

                        if ((xVal <= count) && (xVal >= start))
                        {
                            if (Math.Abs(prevXValue - xVal) >= xTolerance || Math.Abs(prevYValue - yVal) >= yTolerance)
                            {
                                xValue = (float)(left + availableSize.Width * ((xVal - xStart) / xDelta));
                                yValue = (float)(top + availableSize.Height * (1 - ((yVal - yStart) / yDelta)));
                                xValues.Add(xValue);
                                yValues.Add(yValue);
                                prevXValue = xVal;
                                prevYValue = yVal;
                            }
                        }
                        else if (xVal < start)
                        {
                            startIndex = i;
                        }
                        else if (xVal > count)
                        {
                            xValue = (float)(left + availableSize.Width * ((xVal - xStart) / xDelta));
                            yValue = (float)(top + availableSize.Height * (1 - ((yVal - yStart) / yDelta)));
                            xValues.Add(xValue);
                            yValues.Add(yValue);
                            break;
                        }
                    }

                    if (startIndex > 0)
                    {
                        xValue = (float)(left + availableSize.Width * ((xChartVals[startIndex] - xStart) / xDelta));
                        yValue = (float)(top + availableSize.Height * (1 - ((yChartVals[startIndex] - yStart) / yDelta)));
                        xValues.Insert(0, xValue);
                        yValues.Insert(0, yValue);
                    }
                }
            }
        }
Beispiel #2
0
        private void TransformToScreenCoVertical()
        {
            Points = new PointCollection();
            double prevXValue    = 0;
            double prevYValue    = 0;
            int    i             = 0;
            double yCoefficient  = 0;
            var    numericalAxis = fastSeries.ActualYAxis as NumericalAxis;
            bool   isScaleBreak  = numericalAxis != null && numericalAxis.AxisRanges != null && numericalAxis.AxisRanges.Count > 0;

            xValues = (Series.ActualXValues is List <double> && !Series.IsIndexed) ? Series.ActualXValues as List <double> : Series.GetXValues();
            var isGrouping = (fastSeries.ActualXAxis is CategoryAxis) ? (fastSeries.ActualXAxis as CategoryAxis).IsIndexed : true;

            int startIndex = 0;

            prevXValue = fastSeries.IsIndexed ? 1 : xChartVals[0];
            prevYValue = yChartVals[0];
            int cnt = xChartVals.Count - 1;

            if (fastSeries.isLinearData)
            {
                for (i = 1; i < cnt; i++)
                {
                    double xVal = xChartVals[i];
                    double yVal = yChartVals[i];

                    if ((xVal <= xEnd) && (xVal >= xStart))
                    {
                        if (Math.Abs(prevXValue - xVal) >= xTolerance || Math.Abs(prevYValue - yVal) >= yTolerance)
                        {
                            yCoefficient = (isScaleBreak ? numericalAxis.CalculateValueToCoefficient(yVal) : 1 - ((yEnd - yVal) / yDelta));
                            Points.Add(new Point((yOffset + ySize * yCoefficient), (xOffset + xSize * ((xEnd - xVal) / xDelta))));
                            prevXValue = xVal;
                            prevYValue = yVal;
                        }
                    }
                    else if (xVal < xStart)
                    {
                        if (x_isInversed)
                        {
                            yCoefficient = (isScaleBreak ? numericalAxis.CalculateValueToCoefficient(yVal) : 1 - ((yEnd - yVal) / yDelta));
                            Points.Add(new Point((yOffset + ySize * yCoefficient), (xOffset + xSize * ((xEnd - xVal) / xDelta))));
                        }
                        else
                        {
                            startIndex = i;
                        }
                    }
                    else if (xVal > xEnd)
                    {
                        double yValue = ChartMath.GetInterpolarationPoint(xChartVals[i - 1], xChartVals[i], yChartVals[i - 1], yChartVals[i], xEnd);
                        yCoefficient = (isScaleBreak ? numericalAxis.CalculateValueToCoefficient(yValue) : 1 - ((yEnd - yValue) / yDelta));
                        Points.Add(new Point((yOffset + ySize * yCoefficient), (xOffset)));
                        break;
                    }
                }
            }
            else
            {
                for (i = 1; i < cnt; i++)
                {
                    double xVal = xChartVals[i];
                    double yVal = yChartVals[i];
                    if (Math.Abs(prevXValue - xVal) >= xTolerance || Math.Abs(prevYValue - yVal) >= yTolerance)
                    {
                        yCoefficient = (isScaleBreak ? numericalAxis.CalculateValueToCoefficient(yVal) : 1 - ((yEnd - yVal) / yDelta));
                        Points.Add(new Point((yOffset + ySize * yCoefficient), (xOffset + xSize * ((xEnd - xVal) / xDelta))));
                        prevXValue = xVal;
                        prevYValue = yVal;
                    }
                }
            }

            if (startIndex > 0)
            {
                double yValue = ChartMath.GetInterpolarationPoint(xChartVals[startIndex], xChartVals[startIndex + 1], yChartVals[startIndex], yChartVals[startIndex + 1], xStart);
                yCoefficient = (isScaleBreak ? numericalAxis.CalculateValueToCoefficient(yValue) : 1 - ((yEnd - yValue) / yDelta));
                Points.Insert(0, new Point((yOffset + ySize * yCoefficient), (xOffset + xSize * ((xEnd - xStart) / xDelta))));
            }
            else
            {
                yCoefficient = (isScaleBreak ? numericalAxis.CalculateValueToCoefficient(yChartVals[startIndex]) : 1 - ((yEnd - yChartVals[startIndex]) / yDelta));
                Points.Insert(0, new Point((yOffset + ySize * yCoefficient), (xOffset + xSize * ((xEnd - xChartVals[startIndex]) / xDelta))));
            }

            if (i == cnt)
            {
                yCoefficient = (isScaleBreak ? numericalAxis.CalculateValueToCoefficient(yChartVals[cnt]) : 1 - ((yEnd - yChartVals[cnt]) / yDelta));
                Points.Add(new Point((yOffset + ySize * yCoefficient), (xOffset + xSize * ((xEnd - xChartVals[cnt]) / xDelta))));
            }
        }