Московский авиационный институт (Национальный исследовательский университет) Факультет прикладной математики и физики Отчет по курсовой работе По курсу "Компьютерная графика" тема "Кубическая поверхность Безье" Студент: Жданов С.В, Группа: 8О-304Б Руководитель: Сластушенский Ю.В. Оценка: Дата: Москва, 2013 Задание: Составить и отладить программу, обеспечивающую визуализацию порции поверхности заданного типа. Исходные данные готовятся самостоятельно и вводятся из файла или в панели ввода данных. Должна быть обеспечена возможность тестирования программы на различных наборах исходных данных. Программа должна обеспечивать выполнение аффинных преобразований для заданной порции поверхности, а так же возможность управлять количеством изображаемых параметрических линий. Для визуализации параметрических линий поверхности разрешается использовать только функции отрисовки отрезков в экранных координатах. Вариант: Линейная поверхность ( направляющие - кубические кривые Безье 3D) Метод решение: Создаём 16 точек, и записываем их в двоичный массив (4х4), для каждых 4 точек создать кривую Безье и записываем их в двоичный массив (4хn, где n аппроксимация программы), затем для точек massive[i][j] (где i= 0,1,2,3) создать кривые Безье, в итоги получится массив nxn. Описание программы: Программа состоит из одной формы, и класса Plane4x4. В классе Plane4x4 записываются массивы с координатами вершин, и считаются кривые Безье и записываются в массивы координат. class Plane4x4 { public List<Vertex> vertexes; (массив 4х4) public List<List<Vertex>> Bvertexes; (массив 4х approximation) public List<List<Vertex>> BOvertexes;( массив approximation х approximation) int approximation; public void BezierCurve(int approximation); (считает Bvertexes и BOvertexes) } В форме задается объект класс Plane4x4, перед каждой прорисовкой заново считает координаты вершин. Для изменения координат вершин используется панели в которых можно выбирать вершины и с помощью изменением локации мышки меняеть координаты вершин. private void PanelTopMouseDown(object sender, MouseEventArgs e) (событие при MouseDown панели) { lastMea = e; if (cbSelect.Checked == true) { foreach (Vertex p in plane.vertexes) { if (p.x + 5 >= e.X - panelTop.Width / 2 && p.x - 5 <= e.X - panelTop.Width / 2 && p.z + 5 >= e.Y - panelTop.Height / 2 && p.z - 5 <= e.Y - panelTop.Height / 2) { selected = p; break; } } } } private void PanelTopMouseUp(object sender, MouseEventArgs e) (событие при панели) { try { if (cbMove.Checked == true) { selected.x += e.X - lastMea.X; selected.z += e.Y - lastMea.Y; } } catch (Exception) { }; }
1/--страниц