МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования «Казанский национальный исследовательский технический университет им. А.Н. Туполева-КАИ» Институт компьютерных технологий и защиты информации Кафедра Прикладной математики и Информатики имени Ю.В. Кожевникова Отчет по дисциплине «Компьютерная графика» Лабораторная работа №1 «Введение в систему программирования» Выполнил студент группы 4210 Мингалиев Р.Р. Казань 2021 Краткая теория: В OpenGL геометрический объект создается в терминах мировой системы координат (МСК). Это система координат, в которой мыслит программист при создании геометрического объекта. В МСК программист выделяет прямоугольное окно – мировое окно, содержимое которого и будет отображаться в порт просмотра (viewport) на экране видеомонитора (ВМ). Следующие функции реализуют схему, показанную на рисунке: voidgluOrtho2D(GLdouble l, GLdouble r, GLdouble b, GLdouble t) – установка мирового окна; void glutInitWindowSize (int width, int height) – установка размеров window; void glutInitWindowPosition (int a, int b) -установка положения window; void glViewport (GLint x, GLint y, GLsizei w, GLsizei h) - установка viewport. Точки (вершины) в OpenGL используются для задания отрезка, ломаной или многоугольника. Пример задания вершины: glVertex2i(10, 20). Последовательность вершин, имеющих самостоятельный смысл, назовем примитивом. Примитивы или группы подобных примитивов задаются между функциями glBegin и glEnd. Прототипы функций glBegin и glEnd: void glBegin(GLenummode); void glEnd(void). Краткое пояснение некоторых функций: glutInit(&argc, argv) – инициализация библиотеки GLUT. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) – устанавливается режим дисплея: использовать один буфер для кадра; цвета представлять как смесь RGB. glutInitWindowSize(640, 480) – устанавливается размер экранного окна window. glutInitWindowPosition(50, 50) - устанавливается положение (позиция) экранного окна window. glutCreateWindow("Myprog") – инициализируется открытие экранного окна window. glutDisplayFunc(draw) – функция draw( ) регистрируется как функция обратного вызова для события открытия или обновления экранного окна. glutMainLoop( ) – переводит программу в бесконечный цикл ожидания события. glClearColor(1.0, 1.0, 0.0, 0.0) – назначает то значение буфера цвета экранного окна, которое будет установлено при его сбросе (очистке) функцией glClear(GL_COLOR_BUFFER_BIT).По существу это назначение цвета фона. glMatrixMode(GL_PROJECTION) – в качестве текущей устанавливается матрица проецирования. glLoadIdentity( ) – текущая матрица устанавливается в единицу. gluOrtho2D(0.0, 2.0, 0.0, 1.0) – устанавливается мировое окно. glColor3f(1.0, 0.0, 0.0) – устанавливается цвет рисования. glViewport(10, 10, 600, 400) – устанавливается положение и размеры порта просмотра. glFlush() – принудительное выполнение накопленных команд OpenGL. Задания для выполнения: 1. Создайте программу, рисующую на экране график функции: 1) y(x) = sin(x) /x, где – const; 2) y(t) = sin(1t)cos(2t), где 1, 2– const; 3) y(t) = e^(-at)sin(t), где e, a, – const; 4) x(t) = sin(t); y(t) = cos(t), где– const; 5) x(t) = Asin(t); y(t) = Bcos(t), где A, B, – const; 6) y(x) = Ax^3 + Bx^2 +Cx +D, где A, B, C, D – const. Значения констант и диапазон изменения переменных подберите так, чтобы на экране хорошо просматривались особенности графика функции. 2. Создайте программу, которая покрывает экранное окно window мозаикой по примеру, разобранному выше. Рисунок для элемента мозаики придумайте сами. Поэкспериментируйте с размерами элементов мозаики и их количеством. Результат работы программы Листинг программы glColor3f(0.0, 0.0, 1.0); glBegin(GL_POINTS); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINE_STRIP); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINE_LOOP); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_TRIANGLES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_TRIANGLE_STRIP); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_TRIANGLE_FAN); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_QUADS); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_QUAD_STRIP); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_POLYGON); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, 2.0); glEnd(); ЗАДАНИЕ 1 y(x) = sin(x) /x, где – const void draw() { GLfloat PI = 3.14, x, y, a = 1; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glViewport(10, 10, 600, 400); glBegin(GL_LINE_STRIP); for (x = -2 * PI - 2; x <= 2 * PI + 2; x += PI / 18) { y = sin(a * x) / (a * x); glVertex2f(x, y); } glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, -2.0); glEnd(); glFlush(); } y(t) = sin(1t)cos(2t), где 1, 2 – const void draw() { GLfloat PI = 3.14, x, y, a = 1, b = 2; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glViewport(10, 10, 600, 400); glBegin(GL_LINE_STRIP); for (x = -2 * PI - 2; x <= 2 * PI + 2; x += PI / 18) { y = sin(a * x) * cos(b * x); glVertex2f(x, y); } glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, -2.0); glEnd(); glFlush(); } y(t) = e^(at)sin(t), где e, a, – const void draw() { GLfloat PI = 3.14, x, y, w = 1, a = 0.1; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glViewport(10, 10, 600, 400); glBegin(GL_LINE_STRIP); for (x = -2 * PI - 2; x <= 2 * PI + 2; x += PI / 18) { y = exp(-a * x) * sin(w * x); glVertex2f(x, y); } glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, -2.0); glEnd(); glFlush(); } x(t) = sin(t); y(t) = cos(t), где – const void draw() { GLfloat PI = 3.14, x, y, t, w = 1; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glViewport(10, 10, 600, 400); glBegin(GL_LINE_STRIP); for (t = -2 * PI - 2; t <= 2 * PI + 2; t += PI / 18) { x = sin(w * t); y = cos(w * t); glVertex2f(x, y); } glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, -2.0); glEnd(); glFlush(); } x(t) = Asin(t); y(t) = Bcos(t), где A, B, – const void draw() { GLfloat PI = 3.14, x, y, t, w = 1, A = 1.5, B = 0.5; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glViewport(10, 10, 600, 400); glBegin(GL_LINE_STRIP); for (t = -2 * PI - 2; t <= 2 * PI + 2; t += PI / 18) { x = A * sin(w * t); y = B * cos(w * t); glVertex2f(x, y); } glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, -2.0); glEnd(); glFlush(); } y(x) = Ax3 + Bx2 +Cx +D, где A, B, C, D – const void draw() { GLfloat PI = 3.14, x, y, A = 1, B = 1, C = 1, D = 1; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); glViewport(10, 10, 600, 400); glBegin(GL_LINE_STRIP); for (x = -2 * PI - 2; x <= 2 * PI + 2; x += PI / 18) { y = A * pow(x, 3) + B * pow(x, 2) + C * x + D; glVertex2f(x, y); } glEnd(); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); glVertex2f(0.0, 2.0); glVertex2f(0.0, -2.0); glEnd(); glFlush(); } ЗАДАНИЕ 2 void draw() { GLfloat l = -100, r = 100, b = 100, t = 100; GLint x = 0, y = 0, w = 60, h = 60; glClear(GL_COLOR_BUFFER_BIT); gluOrtho2D(l, r, b, t); for (x = 0; x <= 600; x += w) for (y = 0; y <= 480; y += h) { glViewport(x, y, w, h); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINES); glVertex2f(0.0, 0.0); glVertex2f(0.0, 100.0); glEnd(); } glFlush(); } Листинг программы, рисующей на экране график функции y(t) = e^(-a*t)*sin(t), где e, a, – const: #include<glut.h> #include <math.h> void init(); void draw(); //-----------------------// Главная функция //-----------------------void main(int argc, char** argv) { glutInit(&argc, argv); //инициализация библиотеки GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //установка режима дисплея: использовать один буфер для кадра; цвета представлять как смесь RGB glutInitWindowSize(640, 480); // установка размера экранного окна window (640x480) glutInitWindowPosition(50, 50); //установка положения (позиции) экранного окна window glutCreateWindow("Лаба 1.1"); //инициализация открытия экранного окна window (название окна "Myprog") init(); glutDisplayFunc(draw); //регистрация функции draw( ) как функции обратного вызова для события открытия или обновления экранного окна glutMainLoop(); //перевод программs в бесконечный цикл ожидания события } //--------------------------------// Функция инициализации //--------------------------------void init() { glClearColor(0.9, 0.9, 0.9, 0.0); //назначает то значение буфера цвета экранного окна, которое будет установлено при его сбросе (очистке) функцией glClear(GL_COLOR_BUFFER_BIT) glMatrixMode(GL_PROJECTION); //в качестве текущей устанавливается матрица проецирования glLoadIdentity(); //текущая матрица устанавливается в единицу gluOrtho2D(-8.0, 8.0, -2.0, 2.0); //устанавливается мировое окно } //--------------------------------// Функция рисования //--------------------------------void draw() { GLfloat PI = 3.14, x, y, w = 1, a = 1, e = 2.7; //объявление и инициализация переменных типа GLfloat glClear(GL_COLOR_BUFFER_BIT); //очистка буфера цвета glColor3f(1.0, 0.0, 0.0); //установка цвета рисования glViewport(10, 10, 600, 400); //создание порта просмотра //вывод графика функции y(t) = e^(-a*t)*sin(w*t) glBegin(GL_LINE_STRIP); for (x = -2 * PI - 2; x <= 2 * PI + 2; x += PI / 18) { y = pow(e,-1*a*x)*sin(w*x); //расчёт значения у glVertex2f(x, y); //задание точки с координатами (x,y) } glEnd(); //рисование осей glColor3f(0.0, 0.0, 1.0); //установка цвета рисования glBegin(GL_LINES); glVertex2f(-8.0, 0.0); glVertex2f(8.0, 0.0); //задание вершин glVertex2f(0.0, 2.0); glVertex2f(0.0, -2.0); //задание вершин glEnd(); glFlush(); //принудительное выполнение накопленных команд OpenGL } Листинг программы, которая покрывает экранное окно window мозаикой: #include<glut.h> #include <math.h> void init(); void draw(); //-----------------------// Главная функция //-----------------------void main(int argc, char** argv) { glutInit(&argc, argv); //инициализация библиотеки GLUT glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //установка режима дисплея: использовать один буфер для кадра; цвета представлять как смесь RGB glutInitWindowSize(640, 480); // установка размера экранного окна window (640x480) glutInitWindowPosition(50, 50); //установка положения (позиции) экранного окна window glutCreateWindow("Myprog"); //инициализация открытия экранного окна window (название окна "Myprog") init(); glutDisplayFunc(draw); //регистрация функции draw( ) как функции обратного вызова для события открытия или обновления экранного окна glutMainLoop(); //перевод программs в бесконечный цикл ожидания события } //--------------------------------// Функция инициализации //--------------------------------void init() { glClearColor(0.9, 0.9, 0.9, 0.0); //назначает то значение буфера цвета экранного окна, которое будет установлено при его сбросе (очистке) функцией glClear(GL_COLOR_BUFFER_BIT) glMatrixMode(GL_PROJECTION); //в качестве текущей устанавливается матрица проецирования glLoadIdentity(); //текущая матрица устанавливается в единицу gluOrtho2D(-8.0, 8.0, -2.0, 2.0); //устанавливается мировое окно } //--------------------------------// Функция рисования //--------------------------------void draw() { GLfloat l = -100, r = 100, b = -100, t = 100; //объявление и инициализация переменных типа GLfloat GLint x = 0, y = 0, w = 60, h = 60; //объявление и инициализация переменных типа GLint glClear(GL_COLOR_BUFFER_BIT); //очистка буфера цвета gluOrtho2D(l, r, b, t); //установка мирового окна for (x = 0; x <= 600; x += w) for (y = 0; y <= 480; y += h) { glViewport(x, y, w, h); //установка положения и размеров порта просмотра glColor3f(0.0, 0.0, 1.0); //установка цвета рисования glBegin(GL_LINES); glVertex2f(0.0, 0.0); glVertex2f(0.0, 100.0); //задание вершин glEnd(); } glFlush(); //принудительное выполнение накопленных команд OpenGL }