Пример программы отрисовки базовых примитивов средствами OpenGL Лабораторная работа №3 Тема:Создание базовых примитивов стандартными методами OpenGL Цель: приобрести практические навыки отрисовки примитивов на плоскости при помощи стандартных средств OpenGL и создания простейшего приложения с помощью библиотеки Glut. Задание. 1. С использованием библиотеки Glut создать приложение, отображающее окно (рамка, заголовок, кнопки минимизации и закрытия). 2. Используя функции библиотеки OpenGL в клиентской области окна отобразить двухмерную систему декартовых координат (оси, стрелки, разметка осей, подписи осей, точка 0). 3. Согласно индивидуальному варианту задания (таблица 1) отобразить в построенной в пункте 2 системе координат геометрический объект с указанными атрибутами. Примечание: размер геометрического объекта должен составлять порядка 70% площади клиентской области окна. Если требуется построение многоугольника, то он должен быть правильным. 4. Дополнительно возможно использование функций управления клавиатурой и/или мышью. Таблица 1 – Геометрические объекты № | Объекты | Атрибуты | Цвет линии (RGB) | Тип линии | Цвет заливки / толщина линии | 1. | Квадрат | Черный | Пунктирная | Белый | 2. | Пятиугольник | Красный | Сплошная | Желтый | 3. | Ломаная линия | Зеленый | Штрих-пунктирная | 4 пиксела | 4. | Треугольник | Желтый | Сплошная | Белый | 5. | Соединенные четырехугольники | Синий | Штриховая | 2 пиксела | 6. | Линии | Фиолетовый | Штриховая | 3 пиксела | 7. | Прямоугольник | Голубой | Сплошная | Зеленый | 8. | Веер соединенных треугольников | Белый | Сплошная | Черный | 9. | Замкнутая ломаная линия | Светло-синий | Штриховая | 5 пиксела | 10. | Шестиугольник | Светло-зеленый | Штрих-пунктирная | 2 пиксела | 11. | Восьмиугольник | Бордовый | Сплошная | Голубой | 12. | Цепочка соединенных треугольников | Оранжевый | Пунктирная | 1 пиксел | 13. | Квадрат | Розовый | Сплошная | Желтый | 14. | Пятиугольник | Серый | Сплошная | Светло-зеленый | 15. | Ломаная линия | Коричневый | Пунктирная | 1 пиксел | 16. | Треугольник | Темно-зеленый | Сплошная | Салатный | 17. | Соединенные четырехугольники | Сиреневый | Сплошная | Красный | 18. | Линии | Бирюзовый | Пунктирная | 2 пиксела | 19. | Прямоугольник | Алый | Сплошная | Желтый | 20. | Веер соединенных треугольников | Оранжевый | Сплошная | Серый | 21. | Замкнутая ломаная линия | Грязно-зеленый | Штриховая | 4 пиксела | 22. | Плавно изогнутая линия | Темно-зеленый | Штрих-пунктирная | 3 пиксела | 23. | Восьмиугольник | Темно-синий | Сплошная | Оранжевый | 24. | Цепочка соединенных треугольников | Фиолетовый | Штриховая | 3 пиксела | 25. | Шестиугольник | Серый | Сплошная | Светло-красный | Содержание отчета: 1) титульный лист с подписью; 2) задание, № варианта; 3) теоретическая справка - описание основных функций (при построении окна) и функций по варианту с параметрами; 4) выводы; 5) экранные формы; 6) листинг программы. Срок выполнения работы – 2 занятия. Пример программы отрисовки базовых примитивов средствами OpenGL #include <windows.h> #include <gl\gl.h> #include <gl\glut.h> #include <math.h> #define N 7 #define PI 3.1415926535897932384626433832795f int d=0; float l=40; void R(int w,int h) //функция реакции на изменение размера окна { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); //режим проекции матрицы вида glLoadIdentity(); //загрузка матрицы вида glOrtho(-l,l,-l,l,-l,l); //размер области видимости } void K(unsigned char k,int x,int y) //функция реакции на нажатие клавиши { if (k==27) //escape { exit(0); } } void D() //функция реакции на требование перерисовки окна { int i; glClearColor(0.5,0.5,0.5,0); //цвет фона glClear(GL_COLOR_BUFFER_BIT); //очистка окна glMatrixMode(GL_MODELVIEW); //модельный режим матрицы вида glLoadIdentity(); //загрузка матрицы вида glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glColor3f(1,1,0); glBegin(GL_QUAD_STRIP); glVertex2f(-0.75*l,-0.75*l); glVertex2f(-0.6*l,0.75*l); glVertex2f(0.15*l,-0.6*l); glVertex2f(0.1*l,0.6*l); glVertex2f(0.6*l,-0.75*l); glVertex2f(0.75*l,0.75*l); glEnd(); glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor3f(0,0,1); //установка цвета линий glEnable(GL_LINE_STIPPLE); //разрешение изменять тип линии glLineStipple(3,0x5555); //установка типа линии glBegin(GL_QUAD_STRIP); glVertex2f(-0.75*l,-0.75*l); glVertex2f(-0.6*l,0.75*l); glVertex2f(0.15*l,-0.6*l); glVertex2f(0.1*l,0.6*l); glVertex2f(0.6*l,-0.75*l); glVertex2f(0.75*l,0.75*l); glEnd(); glDisable(GL_LINE_STIPPLE); //запрет изменять тип линии // Коорд.оси glBegin(GL_LINES); //рисуем координатные оси: glColor3f(1,0,0); //красным - OX glVertex2f(-l,0); glVertex2f(l,0); glColor3f(0,1,0); //зеленым - OY glVertex2f(0,-l); glVertex2f(0,l); glEnd(); // Подпись оси glColor3f(1,0,0); //красным - OX glRasterPos2f(l-1,-2); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'x'); glColor3f(0,1,0); //зеленым - OY glRasterPos2f(-1.1,l-2); glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24,'y'); glFlush(); } void main(int c,char *v[]) { glutInit(&c,v); glutInitWindowPosition(100,100); glutInitWindowSize(800,600); glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); glutCreateWindow("======="); glutKeyboardFunc(K); glutReshapeFunc(R); glutDisplayFunc(D); glutMainLoop(); } |