Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        /// <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; // Возвращает список треугольников.
        }
Ejemplo n.º 3
0
        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;
            }
        }