Введение в работу – Графическая библиотека GDI была создана как интерфейс Windows для представления графических объектов. Она отвечала за отрисовку линий и кривых, отображение шрифтов и обработку палитры. С выходом Windows XP появился потомок подсистемы, GDI+, основанной на C++ .GDI+ является улучшенной средой для 2D-графики, в которую добавлены такие возможности, как сглаживание линий (antialiasing), использование координат с плавающей точкой градиентная заливка . Однако ни GDI ,ни в GDI+ нет растеризации для отрисовки 3D-графики.
Цель настоящей работы – разработка алгоритма и графического модуля, демонстрирующих возможности GDI+ по работе с трехмерной графикой.
Разработка может использоваться в учебном процессе для ознакомления студентов со стандартными средствами GDI+ и их возможными комбинациями с целью ознакомления с максимально эффективным алгоритмом разработки трехмерной графики, а так же для моделирования простых трехмерных объектов, используя разработанный алгоритм и библиотеку GDI+.
Входные и выходные данные
• Тип фигуры(призма, пирамида, бипирамида, звезда);
• Параметры фигуры(цвет, радиус , высота, скорость вращения, количество сторон);
• Требования к входным данным:
• Вхождение в диапазон
• 0<= цвет <=255;
• 64<= радиус <=128;
• 3<= количество сторон <=8;
• -128<= высота <=128;
• -1<= скорость вращения <=1.
Выходными данными являются:
Фигуры, отображаемые на экране, параметры которых изменяются.
Требования к выходным данным:
• Фигуры не должны мерцать ;
•Заливка не должна выходить за пределы фигуры ;
• Параметры фигуры и сама фигура должны меняться по таймеру .
Алгоритм:
Координаты:
1. Задаются параметры фигуры
2. В зависимости от типа фигуры задаются центры одной или двух окружностей(Две для призмы) и вершины( призма -0, пирамида -1, бипирамида -2)
3. В зависимости от заданного количества окружности разбиваются по формуле:
c(i).X = Fix(радиус * Math.Cos(скорость + №точки * Math.PI / кол-во сторон))
c(i).Y = Fix(-30 * Math.Sin(скорость + №точки * Math.PI / кол-во сторон))
Прорисовка:
4. Из массива координат создается массив вершин путем объединения нескольких координат в отдельном массиве.
5. Из массива координат делается массив вершин путем объединения нескольких координат в другой массив.
6. Точки разбиения окружности соединяются друг с другом и с вершиной(-ами)
7. Для заливки граней выбираются 3(4) точки одной грани и соединяются. Для заливки основания(-й) выбираются первая, вторая и последняя точки.
8. Вывод на экран осуществляется в бесконечном цикле буферизации.
Фрагмент Кода
For i = 1 To n//координатный цикл
c(i).X = Fix(r * Math.Cos( i * Math.PI / an))//вычисление координаты x
c(i).Y = Fix(-30 * Math.Sin( i * Math.PI / an)) вычисление координаты y
If i <= n / 2 Then h(i) = 1 / 40 * centerpz Else h(i) = -1 / 40 * centerpz//корреляционный параметр для перевода координаты y в трехмерное пространство.
c(i).Y = 96 * c(i).Y / (100 + h(i))/перевод координаты y в трехмерное пространство.
c(n + 1).X = c(1).X
c(n + 1).Y = c(1).Y//задние рвенства последнео элемента массива равным первому для замыкания окружности
Next}
Dim Lgb As New LinearGradientBrush( _// Градиентная заливка
New Point(c(1).X, c(1).Y), _ // первая точка
New Point(c(n).X, c(n).Y), _ // вторая точка
Color.FromArgb(190, i2, j, k), _// первый цвет
(Color.FromArgb(190, k, i2, j))) // второй цвет
Lgb.SetSigmaBellShape(0.5, 1)//коэффициент градиента
Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick//изменение параметра радиус по таймеру
If HScrollBar5.Value = 32 Then bul2 = False
If HScrollBar5.Value = 128 Then bul2 = True
If bul2 = True Then HScrollBar5.Value -= 1//уменьшать до минимального
If bul2 = False Then HScrollBar5.Value += 1//увеличивать до максимального.
r = HScrollBar5.Value//присвоение значения переменной
TextBox5.Text = r // вывод значния переменной.
Описания результатов решения
Написанная программа полностью соответствует поставленной задаче. Она решает ряд проблем, описанных в цели разработки, облегчает и ускоряет разработку графических
приложений.
Также данная программа имеет удобный пользовательский интерфейс, легка в управлении.
Скриншоты: