Файл: Пояснительная записка к расчетнографической работе. Вариант 5 Opengl группа авт241 Студент Базаров Б. Н.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2023
Просмотров: 26
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Пояснительная записка к расчетно-графической работе.
Вариант №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;
}
Пример работы программы: