Пояснительная записка к расчетнографической работе. Вариант 5 Opengl группа авт241 Студент Базаров Б. Н
Скачать 41.51 Kb.
|
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Пояснительная записка к расчетно-графической работе. Вариант №5 OpenGL Группа: АВТ-241 Студент: Базаров Б. Н. Преподаватель: Пешков А. В. НОВОСИБИРСК 2022 Задание: «Насекомое и лампочка». Насекомое летит на источник света таким образом, чтобы угол между источником и направлением вектора скорости был постоянным, т.е. по спирали. Ударяясь о поверхность лампочки, переходи в режим свободного падения с сохранением горизонтальной составляющей скорости при ударе (отскок от поверхности). Насекомые появляются со случайными начальными точками и скоростями. Основной текст программы: #include #include #include #include "glut.h" #include #define M_PI 3.1415926535 #define NUM_INSECTS 10 // количество насекомых #define MAX_SPEED 0.1 // максимальная скоро typedef struct { float x, y; // координаты float vx, vy; // скорость } Insect; // создаем массив насекомых Insect insects[NUM_INSECTS]; void init() { // инициализируем каждое насекомое случайными координатами и скоростями for (int i = 0; i < NUM_INSECTS; i++) { insects[i].x = 2.0 * ((float)rand() / RAND_MAX) - 1.0; insects[i].y = 2.0 * ((float)rand() / RAND_MAX) - 1.0; insects[i].vx = MAX_SPEED * (2.0 * ((float)rand() / RAND_MAX) - 1.0); insects[i].vy = MAX_SPEED * (2.0 * ((float)rand() / RAND_MAX) - 1.0); } } void timer(int value) { // обновляем координаты насекомых for (int i = 0; i < NUM_INSECTS; i++) { insects[i].x += insects[i].vx; insects[i].y += insects[i].vy; // если насекомое ударилось об поверхность, то отражаем его if (insects[i].x >= 1.0 || insects[i].x <= -1.0) { insects[i].vx = -insects[i].vx; } if (insects[i].y >= 1.0 || insects[i].y <= -1.0) { insects[i].vy = -insects[i].vy; } } // перерисовываем сцену glutPostRedisplay(); // устанавливаем таймер на следующий кадр glutTimerFunc(1000 / 60, timer, 0); } void display() { // очищаем экран glClear(GL_COLOR_BUFFER_BIT); // рисуем насекомых glColor3f(1.0, 0.0, 0.0); for (int i = 0; i < NUM_INSECTS; i++) { glBegin(GL_TRIANGLE_FAN); glVertex2f(insects[i].x, insects[i].y); for (int j = 0; j <= 360; j++) { float degInRad = j * M_PI / 180; glVertex2f(insects[i].x + 0.1 * cos(degInRad), insects[i].y + 0.1 * sin(degInRad)); } glEnd(); } // рисуем источник света glColor3f(1.0, 1.0, 0.0); glBegin(GL_TRIANGLE_FAN); glVertex2f(0.0, 0.0); for (int j = 0; j <= 360; j++) { float degInRad = j * M_PI / 180; glVertex2f(0.1 * cos(degInRad), 0.1 * sin(degInRad)); } glEnd(); // отображаем результат glutSwapBuffers(); } int main(int argc, char** argv) { // инициализация GLUT glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(400, 400); glutCreateWindow("Insect and Lamp"); // инициализация насекомых init(); // устанавливаем функцию обработки события таймера glutTimerFunc(0, timer, 0); // устанавливаем функцию отрисовки сцены glutDisplayFunc(display); // запускаем цикл обработки событий glutMainLoop(); return 0; } Пример работы программы: |