private void настройкиToolStripMenuItem_Click(object sender, EventArgs e) { _settingsDialog.XMax = ucGLPanel1.XMax; _settingsDialog.XMin = ucGLPanel1.XMin; _settingsDialog.YMax = ucGLPanel1.YMax; _settingsDialog.YMin = ucGLPanel1.YMin; _settingsDialog.ZMax = ucGLPanel1.ZMax; _settingsDialog.ZMin = ucGLPanel1.ZMin; _settingsDialog.AutoZ = ucGLPanel1.AutoZ; _settingsDialog.DrawMode = ucGLPanel1.Mode; _settingsDialog.Color = ucGLPanel1.PaintColor; _settingsDialog.LineWidth = ucGLPanel1.LineWidth; _settingsDialog.ShowDialog(); if (_settingsDialog.DialogResult == System.Windows.Forms.DialogResult.OK) { ucGLPanel1.XMax = _settingsDialog.XMax; ucGLPanel1.XMin = _settingsDialog.XMin; ucGLPanel1.YMax = _settingsDialog.YMax; ucGLPanel1.YMin = _settingsDialog.YMin; ucGLPanel1.ZMax = _settingsDialog.ZMax; ucGLPanel1.ZMin = _settingsDialog.ZMin; ucGLPanel1.AutoZ = _settingsDialog.AutoZ; ucGLPanel1.Mode = _settingsDialog.DrawMode; ucGLPanel1.PaintColor = _settingsDialog.Color; ucGLPanel1.LineWidth = _settingsDialog.LineWidth; if (Solve()) _triangles = Triangulation(_points); } }
/// <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; // Возвращает список треугольников. }
private void ToolStripMenuItemEnterFunction_Click(object sender, EventArgs e) { _enterFunctionDialog.SetFunction(_function); _enterFunctionDialog.ShowDialog(); if (_enterFunctionDialog.DialogResult == System.Windows.Forms.DialogResult.OK) { _function = _enterFunctionDialog.GetFunction(); Cursor = Cursors.WaitCursor; if (_parser.Parse(_function.ToLower())) if (Solve()) { _triangles = Triangulation(_points); ucGLPanel1.Invalidate(); } Cursor = Cursors.Default; } }