/// <summary>
        /// Строит триангуляцию заданного набора точек.
        /// </summary>
        /// <param name="points"> Заданный набор точек. </param>
        /// <returns> Результат триангуляции. </returns>
        public Triangles Triangulation(List<Point3d> points)
        {
            var triangles = new Triangles();

            // Первоначальное задание точек P1, P2, P3.
            var p1 = new Point3d(points[0].X, points[0].Y, points[0].Z, 0);
            var p2 = new Point3d(points[1].X, points[1].Y, points[1].Z, 1);
            var p3 = new Point3d(points[0].X - 2, points[0].Y, 0, -1);

            // Создание стека.
            var stack = new Stack<Point3d>();

            // Помещаем точки в стек.
            stack.Push(p3);
            stack.Push(p2);
            stack.Push(p1);

            while (stack.Count > 0) // Пока стек не пуст.
            {
                // Снимаем точки со стека.
                p1 = stack.Pop();
                p2 = stack.Pop();
                p3 = stack.Pop();
                int index;

                // Получаем массив точек.
                var tempPoints = new List<Point3d>();
                for (int i = 0; i < points.Count; i++ )
                    tempPoints.Add(new Point3d(points[i]));

                // Начальная и конечная точки линии P1 P2
                Point3d tempPS;
                Point3d tempPE;

                if (p2 > p1)    // Конец должен быть дальше начала.
                {
                    tempPS = new Point3d(p1);
                    tempPE = new Point3d(p2);
                }
                else
                {
                    tempPS = new Point3d(p2);
                    tempPE = new Point3d(p1);
                }

                // Если точка с другой стороны прямой найдена, то про возваращается ее индекс > -1
                if ((index = MyMath.FindPointAcrossLine(new Point3d(p3),
                        new VecLine(new Point3d(tempPS), new Point3d(tempPE)), tempPoints)) > -1)
                    {
                        // Создаем триугольник с найднной точкой.
                        var tempTriangle = new Triangle(tempPE, tempPS, points[index]);
                        if (!triangles.ifHas(tempTriangle)) // Если в списке триугольников еще нет этого
                        {
                            // то добавляем его в списко триугольников
                            triangles.Add(new Triangle(tempPE, tempPS, points[index]));
                            // Добавляем вершины в стек.
                            stack.Push(p1);
                            stack.Push(points[index]);
                            stack.Push(p2);

                            stack.Push(p2);
                            stack.Push(points[index]);
                            stack.Push(p1);
                        }

                    }
            }
            triangles.SolveMaxMin(); // Рассчитывает максимальное и минимальное значение вершины Z.
            return triangles; // Возвращает список треугольников.
        }