Файл: Пояснительная записка к расчетнографической работе. Вариант 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;

}
Пример работы программы: