/// <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; // Возвращает список треугольников. }