Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
zvit_lb2_OpenGL.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
131.99 Кб
Скачать

Індивідуальне завдання.

Скласти програму побудови п’ятикутників різних розмірів та кольорів у різних частинах вікна з використанням випадкового вибору. Підписати кожну фігуру кодом кольору. Послідовно витерти всі фігури та підписи.

Текст програми.

#include<gl/glut.h>

#include<math.h>

#include<vector>

#include<iostream>

#include<cstdio>

#include<string>

#include<cstdlib>

usingnamespace std;

classPentagon

{

public:

// Клас фігури п'ятикутника.

float x, y, r, colR, colG, colB, alpha;

Pentagon(float_x=0.0, float_y=0.0, float_r=100.0,

float_colR=0.0, float_colG=0.0, float_colB=0.0):

x(_x), y(_y), r(_r),

colR(_colR), colG(_colG), colB(_colB), alpha(1.0){};

void draw();

};

// Функція візуалізації тексту

void printtext(intx, inty, stringString)

{

glRasterPos2i(x,y);

for (int i=0; i<String.size(); i++)

{

glutBitmapCharacter(GLUT_BITMAP_9_BY_15, String[i]);

}

}

voidPentagon::draw()

{

glColor4f( colR, colG, colB, alpha); // Встановлення кольору фігури.

glEnable(GL_POLYGON_SMOOTH); // Антиаліасінг ON.

glBegin(GL_POLYGON); // Побудова п’ятикутника.

for(float i=0.0; i<2*3.14; i+=3.14/2.5)

{

glVertex2f(this->x+this->r*sin(i), this->y+this->r*cos(i));

}

glEnd();

glDisable(GL_POLYGON_SMOOTH); // Антиаліасінг OFF.

glColor4f( colR, colG, colB, 1.0); // Встановлення кольору тексту.

// Формування і вивід текстових даних.

std::string Color = "RGB: " + std::to_string(int(colR*255))+","+

std::to_string(int(colG*255))+","+ std::to_string(int(colB*255))+"";

std::string Position = "Position(" +std::to_string(int(x)) + ", "+std::to_string(int(y)) +");";

char *cstr = newchar[Color.length() + 1];

char *pstr = newchar[Position.length() + 1];

strcpy(cstr, Color.c_str());

strcpy(pstr, Position.c_str());

char string_c[64];

char string_p[64];

sprintf(string_c, cstr);

sprintf(string_p, pstr);

printtext(x-50,y-25,string_c);

printtext(x-50,y-5,string_p);

}

// Порожній вектор з елементів типу Pentagon.

vector<Pentagon> pent;

// Розміри вікна.

float WinWid=600.0;

float WinHei=500.0;

// Функція візуалізації.

void Draw()

{

glClear(GL_COLOR_BUFFER_BIT); // Очищає поточний буфер кольору, вибраний для запису

glEnable(GL_ALPHA); // Включити Альфа-канал.

glEnable(GL_BLEND); // Включити змішування кольорів

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

vector<Pentagon>::iterator i=pent.begin();

while(i!=pent.end())

{

i->draw(); // Малюємо фігуру,

if(i->alpha<=0.05f) // поки alpha буде більше 0.05,

i=pent.erase(i); // інакше, фігура видаляється.

else

++i;

}

glDisable(GL_BLEND); // Виключити змішування кольорів

glDisable(GL_ALPHA); // Виключити Альфа-канал.

glutSwapBuffers(); // Міняє місцями передній і задній буфери

}

void Timer(intvalue)

{

for(vector<Pentagon>::iterator i=pent.begin(); i!=pent.end(); i++)

{

i->r++; // Збільшення радіусу фігури

i->alpha/=1.05; // Зміна прозорості

}

glutPostRedisplay(); // Перерисовка зображення

glutTimerFunc(40, Timer, 0); // Встановлює таймер.

}

void Timer2(int)

{

// Генеруємо випадкові кольори.

float colR = static_cast<float> (rand()) / static_cast<float> (RAND_MAX);

float colG = static_cast<float> (rand()) / static_cast<float> (RAND_MAX);

float colB = static_cast<float> (rand()) / static_cast<float> (RAND_MAX);

// Генеруємо випадкові координати і радіус. Створюємо нову фігуру.

Pentagon c(rand() % int(WinWid) - WinWid/2, rand() % int(WinHei) - WinHei/2, rand() % 100+1, colR, colG, colB);

pent.push_back(c); // Вставка елемента в кінець вектора

glutPostRedisplay(); // Перерисовка зображення

glutTimerFunc(800, Timer2, 0); // Встановлює таймер.

}

void Initialize()

{

glClearColor(1.0, 1.0, 1.0, 1.0); // Встановлення кольору очистки екрану RGBA.

glMatrixMode(GL_PROJECTION); // Активація проекційної матриці.

glLoadIdentity(); // Очистка матриці.

// Визначає двовимірну матрицю для ортогональної проекції.

glOrtho(-WinWid/2, WinWid/2, WinHei/2, -WinHei/2, -200.0, 200.0); glMatrixMode(GL_MODELVIEW); // Задає поточну матрицю.

}

// Головна функція.

int main(intargc, char *argv[])

{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowSize(WinWid, WinHei);

glutInitWindowPosition(0, 0);

glutCreateWindow("Pentagon");

glutDisplayFunc(Draw);

glutTimerFunc(40, Timer, 0);

glutTimerFunc(80, Timer2, 0);

Initialize();

glutMainLoop();

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]