Індивідуальне завдання.
Скласти програму побудови п’ятикутників різних розмірів та кольорів у різних частинах вікна з використанням випадкового вибору. Підписати кожну фігуру кодом кольору. Послідовно витерти всі фігури та підписи.
Текст програми.
#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;
}
