private void DrawAXLine(Canvas workField)
        {
            var listY = new List <Point>();

            listY.AddRange(GraphicMaster.GetUrPoints((d) => fieldController.XP2XD(d), workField.ActualWidth));

            DrawDecartPoints(listY, workField);
        }
        private void DrawDecartPoints(IEnumerable <Point> points, Canvas workField)
        {
            var xLimit = workField.ActualWidth;
            var yLimit = workField.ActualHeight;

            var pointsToDraw = points.Select(point => new Point(point.X, fieldController.YD2YP(point.Y))).ToList();

            var pointsToDraw0 = ClearAndCutTheLines(pointsToDraw, workField).Where(point => IsPointInField(point, xLimit, yLimit)).ToList();

            var polyLines = new List <Polyline> {
                new Polyline {
                    Stroke = Brushes.LightSeaGreen, StrokeThickness = 2
                }
            };

            var lastPoint = new Point();

            if (pointsToDraw0.Count != 0)
            {
                lastPoint = pointsToDraw0.First();
            }
            foreach (var point in pointsToDraw0)
            {
                if (Math.Abs(lastPoint.X - point.X) > 2 || ((int)fieldController.XD2XP(GraphicMaster.InfinityPoint())) == (int)lastPoint.X)
                {
                    polyLines.Add(new Polyline {
                        Stroke = Brushes.LightSeaGreen, StrokeThickness = 2
                    });
                }
                polyLines.Last().Points.Add(point);
                lastPoint = point;
            }

            polyLines.ForEach(line => workField.Children.Add(line));
        }
        private IEnumerable <Point> ClearAndCutTheLines(List <Point> points, Canvas workField)
        {
            var InZone = new bool[points.Count()];

            var lastPoint = points[0];

            var counter = 0;

            foreach (var point in points)
            {
                if (lastPoint.X - point.X < 2 && (0 < point.Y && point.Y < workField.ActualHeight))
                {
                    InZone[counter] = true;
                }
                lastPoint = point;
                counter++;
            }

            counter = 0;
            var pointsWithoutBlindSpots = new List <Point>();

            foreach (var point in points)
            {
                pointsWithoutBlindSpots.Add(point);

                if (counter > 0)
                {
                    if (!InZone[counter] && !InZone[counter - 1])
                    {
                        if ((pointsWithoutBlindSpots[counter - 1].Y > fieldController.MaxYP
                             &&
                             pointsWithoutBlindSpots[counter].Y < 0
                             ))
                        {
                            pointsWithoutBlindSpots[counter - 1] = new Point(pointsWithoutBlindSpots[counter - 1].X, fieldController.MaxYP);
                            pointsWithoutBlindSpots[counter]     = new Point(pointsWithoutBlindSpots[counter].X, 0);
                        }
                        else if ((pointsWithoutBlindSpots[counter - 1].Y <0
                                                                          &&
                                                                          pointsWithoutBlindSpots[counter].Y> fieldController.MaxYP
                                  ))
                        {
                            pointsWithoutBlindSpots[counter - 1] = new Point(pointsWithoutBlindSpots[counter - 1].X, 0);
                            pointsWithoutBlindSpots[counter]     = new Point(pointsWithoutBlindSpots[counter].X, fieldController.MaxYP);
                        }
                    }
                }
                counter++;
            }

            counter = 0;
            var pointsWithoutInfinitySyndrom = new List <Point>();

            foreach (var point in pointsWithoutBlindSpots)
            {
                pointsWithoutInfinitySyndrom.Add(point);

                counter++;
            }

            var infPixel = (int)fieldController.XD2XP(GraphicMaster.InfinityPoint());

            if (infPixel > 0 && infPixel < counter - 1)
            {
                pointsWithoutInfinitySyndrom[infPixel] = new Point(infPixel, fieldController.MaxYP);
            }
            if (infPixel + 1 > 0 && infPixel < counter - 1)
            {
                pointsWithoutInfinitySyndrom[infPixel + 1] = new Point(infPixel + 1, 0);
            }

            counter = 0;
            var pointsWithoutCuts = new List <Point>();

            foreach (var point in pointsWithoutInfinitySyndrom)
            {
                pointsWithoutCuts.Add(point);

                if (counter > 0)
                {
                    if (InZone[counter - 1] && !InZone[counter])
                    {
                        pointsWithoutCuts[counter] = new Point(pointsWithoutCuts[counter - 1].X, pointsWithoutCuts[counter].Y > 0 ? fieldController.MaxYP : 0);
                    }
                    if (!InZone[counter - 1] && InZone[counter])
                    {
                        pointsWithoutCuts[counter - 1] = new Point(pointsWithoutCuts[counter].X, pointsWithoutCuts[counter - 1].Y > 0 ? fieldController.MaxYP : 0);
                    }
                }
                counter++;
            }

            return(pointsWithoutCuts);
        }