Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma comment(lib, "opengl32.lib")
- #pragma comment(lib, "glut32.lib")
- #pragma comment(lib, "glu32.lib")
- #include <glut.h>
- #include <ctime>
- #include <stdlib.h>
- int LletterR, LletterG, LletterB, VletterR, VletterG, VletterB;
- int DLletterR, DLletterG, DLletterB, DVletterR, DVletterG, DVletterB;
- int ContourLletterR, ContourLletterG, ContourLletterB, ContourVletterR, ContourVletterG, ContourVletterB;
- int DContourLletterR, DContourLletterG, DContourLletterB, DContourVletterR, DContourVletterG, DContourVletterB;
- int Vx, Vy, Lx, Ly;
- int DVx, DVy, DLx, DLy;
- float angleV, angleL, MEangleV, MEangleL;
- bool MEAutoRotateVleft, MEAutoRotateVright, MEAutoRotateLleft, MEAutoRotateLright;
- bool CENTERAutoRotateVleft, CENTERAutoRotateVright, CENTERAutoRotateLleft, CENTERAutoRotateLright;
- void CIRCLE(float xc, float yc, float delta, int part)
- {
- float distance = delta;
- float x, y, dxt;
- long r2, dst, t, s, e, ca, cd, indx;
- r2 = (long)delta * (long)delta;
- dst = 4 * r2;
- dxt = (double)delta / 1.414213562373;
- t = 0;
- s = (-4) * r2 * (long)delta;
- e = (-1)*s / 2. - 3 * r2;
- ca = (-6)*r2;
- cd = (-10)*r2;
- x = 0;
- y = delta;
- float xPre, yPre;
- for (indx = 1; indx <= dxt; indx++)
- {
- x++;
- if (e >= 0)
- e += t + ca;
- else
- {
- y--;
- e += t - s + cd;
- s += dst;
- }
- t -= dst;
- if (indx != 1)
- {
- glBegin(GL_QUADS);
- if (part == 1)
- {
- glVertex2f(xc + xPre, yc + yPre);
- glVertex2f(xc + xPre + distance, yc + yPre);
- glVertex2f(xc + x + distance, yc + y);
- glVertex2f(xc + x, yc + y);
- glVertex2f(xc + yPre, yc + xPre);
- glVertex2f(xc + yPre + distance, yc + xPre);
- glVertex2f(xc + y + distance, yc + x);
- glVertex2f(xc + y, yc + x);
- }
- if (part == 2)
- {
- glVertex2f(xc + yPre, yc - xPre);
- glVertex2f(xc + yPre + distance, yc - xPre);
- glVertex2f(xc + y + distance, yc - x);
- glVertex2f(xc + y, yc - x);
- glVertex2f(xc + xPre, yc - yPre);
- glVertex2f(xc + xPre + distance, yc - yPre);
- glVertex2f(xc + x + distance, yc - y);
- glVertex2f(xc + x, yc - y);
- }
- if (part == 3)
- {
- glVertex2f(xc - xPre, yc - yPre);
- glVertex2f(xc - xPre - distance, yc - yPre);
- glVertex2f(xc - x - distance, yc - y);
- glVertex2f(xc - x, yc - y);
- glVertex2f(xc - yPre, yc - xPre);
- glVertex2f(xc - yPre - distance, yc - xPre);
- glVertex2f(xc - y - distance, yc - x);
- glVertex2f(xc - y, yc - x);
- }
- if (part == 4)
- {
- glVertex2f(xc - yPre, yc + xPre);
- glVertex2f(xc - yPre - distance, yc + xPre);
- glVertex2f(xc - y - distance, yc + x);
- glVertex2f(xc - y, yc + x);
- glVertex2f(xc - xPre, yc + yPre);
- glVertex2f(xc - xPre - distance, yc + yPre);
- glVertex2f(xc - x - distance, yc + y);
- glVertex2f(xc - x, yc + y);
- }
- if (part == 5) {
- glVertex2f(xc + x, yc + y);
- glVertex2f(xc + y, yc + x);
- glVertex2f(xc + y, yc - x);
- glVertex2f(xc + x, yc - y);
- }
- glEnd();
- }
- xPre = x;
- yPre = y;
- }
- glBegin(GL_QUADS);
- if (part == 1)
- {
- glVertex2f(xc + y, yc + x);
- glVertex2f(xc + y + distance, yc + x);
- glVertex2f(xc + x + distance, yc + y);
- glVertex2f(xc + x, yc + y);
- }
- if (part == 2)
- {
- glVertex2f(xc + x, yc - y);
- glVertex2f(xc + x + distance, yc - y);
- glVertex2f(xc + y + distance, yc - x);
- glVertex2f(xc + y, yc - x);
- }
- if (part == 3)
- {
- glVertex2f(xc - y, yc - x);
- glVertex2f(xc - y - distance, yc - x);
- glVertex2f(xc - x - distance, yc - y);
- glVertex2f(xc - x, yc - y);
- }
- if (part == 4)
- {
- glVertex2f(xc - x, yc + y);
- glVertex2f(xc - x - distance, yc + y);
- glVertex2f(xc - y - distance, yc + x);
- glVertex2f(xc - y, yc + x);
- }
- glEnd();
- }
- void Victor(float delta)
- {
- float deltaB = delta*1.3;
- glColor3ub(ContourVletterR, ContourVletterG, ContourVletterB);//big letter
- CIRCLE(0.3 * delta-0.1*delta, 0.8*delta-0.1*delta, 0.5*delta, 1);
- CIRCLE(0.3 * delta-0.1*delta, 0.9*delta+0.1*delta, 0.5*delta, 2);
- CIRCLE(0.3 * delta-0.1*delta, -1.3*delta- 0.1*delta, 0.7*delta, 1);
- CIRCLE(0.3 * delta- 0.1*delta, -1.1*delta+ 0.1*delta, 0.7*delta, 2);
- CIRCLE(delta * 0.8, delta, 1.1*delta, 5);
- CIRCLE(deltaB * 0.8, -deltaB, 1.08*deltaB, 5);
- glBegin(GL_POLYGON);//vertical line V
- glVertex2f(delta * (-1.1)-0.1*delta, -2.6 * delta - 0.1*delta);
- glVertex2f(delta * (-1.1) - 0.1*delta, 2. * delta + 0.1*delta);
- glVertex2f(delta * (-0.7) + delta * 0.5 + 0.1*delta, 2 * delta + 0.1*delta);
- glVertex2f(delta * (-0.7) + delta * 0.5 + 0.1*delta, -2.6 * delta - 0.1*delta);
- glEnd();
- glBegin(GL_POLYGON);//first horizontal V
- glVertex2f(delta * (-1.1) - 0.1*delta, 2 * delta + 0.1*delta);
- glVertex2f(delta * 0.9 + 0.1*delta, 2 * delta + 0.1*delta);
- glVertex2f(delta * 0.9 + 0.1*delta, 1.3*delta - 0.1*delta);
- glVertex2f(delta * (-1.1) - 0.1*delta, 1.3*delta - 0.1*delta);
- glEnd();
- glBegin(GL_POLYGON);//second horizontal V
- glVertex2f(delta * (-1.1) - 0.1*delta, 0.4*delta + 0.1*delta);
- glVertex2f(delta * 0.9 + 0.1*delta, 0.4*delta + 0.1*delta);
- glVertex2f(delta * 0.9 + 0.1*delta, -0.01*delta - 0.1*delta);
- glVertex2f(delta * (-1.1) - 0.1*delta, -0.01*delta - 0.1*delta);
- glEnd();
- glBegin(GL_POLYGON);//third horizontal V
- glVertex2f(delta * (-1.1)- 0.1*delta, 0.05*delta + 0.1*delta);
- glVertex2f(delta * 1.1 + 0.1*delta, 0.05*delta + 0.1*delta);
- glVertex2f(delta * 1.1 + 0.1*delta, -0.6*delta - 0.1*delta);
- glVertex2f(delta * (-1.1) - 0.1*delta, -0.6*delta - 0.1*delta);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(delta * (-1.1)- 0.1*delta, -1.8*delta+ 0.1*delta);
- glVertex2f(delta * 1.1+ 0.1*delta, -1.8*delta+ 0.1*delta);
- glVertex2f(delta * 1.1+ 0.1*delta, -2.6*delta- 0.1*delta);
- glVertex2f(delta * (-1.1)- 0.1*delta, -2.6*delta- 0.1*delta);
- glEnd();
- glColor3ub(VletterR, VletterG, VletterB);//small letter
- CIRCLE(0.3 * delta, 0.8*delta, 0.5*delta, 1);
- CIRCLE(0.3 * delta, 0.9*delta, 0.5*delta, 2);
- CIRCLE(0.3 * delta, -1.3*delta, 0.7*delta, 1);
- CIRCLE(0.3 * delta, -1.1*delta, 0.7*delta, 2);
- CIRCLE(delta * 0.8, delta, delta,5);
- CIRCLE(deltaB * 0.8, -deltaB, deltaB,5);
- glBegin(GL_POLYGON);//vertical line V
- glVertex2f(delta * (-1.1), -2.6 * delta);
- glVertex2f(delta * (-1.1), 2. * delta);
- glVertex2f(delta * (-0.7) + delta * 0.5, 2 * delta);
- glVertex2f(delta * (-0.7) + delta * 0.5, -2.6 * delta);
- glEnd();
- glBegin(GL_POLYGON);//first horizontal V
- glVertex2f(delta * (-1.1), 2 * delta);
- glVertex2f(delta * 0.9, 2 * delta);
- glVertex2f(delta * 0.9, 1.3*delta);
- glVertex2f(delta * (-1.1), 1.3*delta);
- glEnd();
- glBegin(GL_POLYGON);//second horizontal V
- glVertex2f(delta * (-1.1), 0.4*delta);
- glVertex2f(delta * 0.9, 0.4*delta);
- glVertex2f(delta * 0.9, -0.01*delta);
- glVertex2f(delta * (-1.1), -0.01*delta);
- glEnd();
- glBegin(GL_POLYGON);//third horizontal V
- glVertex2f(delta * (-1.1), 0.05*delta);
- glVertex2f(delta * 1.1, 0.05*delta);
- glVertex2f(delta * 1.1, -0.6*delta);
- glVertex2f(delta * (-1.1), -0.6*delta);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(delta * (-1.1), -1.8*delta);
- glVertex2f(delta * 1.1, -1.8*delta);
- glVertex2f(delta * 1.1, -2.6*delta);
- glVertex2f(delta * (-1.1), -2.6*delta);
- glEnd();
- }
- void Lobas(float delta)
- {
- glColor3ub(ContourLletterR, ContourLletterG, ContourLletterB);
- //big letter
- glBegin(GL_POLYGON);//top polygon
- glVertex2f(-delta - 0.8*delta-0.1*delta, 3 * delta+0.1*delta);
- glVertex2f(delta + 1.05*delta+0.1*delta, 3 * delta + 0.1*delta);
- glVertex2f(delta + 1.05*delta + 0.1*delta, 2 * delta - 0.1*delta);
- glVertex2f(-delta - 0.8*delta - 0.1*delta, 2 * delta - 0.1*delta);
- glEnd();
- glBegin(GL_POLYGON);//left polygon
- glVertex2f(-delta + 0.3*delta + 0.13*delta, 2 * delta);
- glVertex2f(-delta - 0.8*delta - 0.1*delta, 2 * delta);
- glVertex2f(-delta - 0.8*delta- 0.1*delta, -delta - 0.2*delta);
- glVertex2f(-delta + 0.3*delta + 0.13*delta, -delta );
- glEnd();
- glBegin(GL_POLYGON);//right polygon
- glVertex2f(delta - 0.05*delta - 0.1*delta, 2 * delta);
- glVertex2f(delta + 1.05*delta + 0.1*delta, 2 * delta);
- glVertex2f(delta + 1.05*delta + 0.1*delta, -2.*delta - 0.1*delta);
- glVertex2f(delta - 0.05*delta - 0.1*delta, -2.*delta - 0.1*delta);
- glEnd();
- CIRCLE(-3 * delta + 0.07*delta-0.24*delta, -delta + 0.021*delta - 0.03*delta+0.15*delta, 1.3*delta, 2);
- //small letter
- glColor3ub(LletterR, LletterG, LletterB);
- glBegin(GL_POLYGON);
- glVertex2f(-delta - 0.8*delta, 3 * delta);
- glVertex2f(delta + 1.05*delta, 3 * delta);
- glVertex2f(delta + 1.05*delta, 2 * delta);
- glVertex2f(-delta - 0.8*delta, 2 * delta);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(-delta + 0.3*delta, 2 * delta);
- glVertex2f(-delta - 0.8*delta, 2 * delta);
- glVertex2f(-delta - 0.8*delta, -delta - 0.1*delta);
- glVertex2f(-delta + 0.3*delta, -delta - 0.1*delta);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(delta - 0.05*delta, 2 * delta);
- glVertex2f(delta + 1.05*delta, 2 * delta);
- glVertex2f(delta + 1.05*delta, -2.*delta);
- glVertex2f(delta - 0.05*delta, -2.*delta);
- glEnd();
- CIRCLE(-3 * delta + 0.07*delta+0.1*delta, -delta + 0.021*delta - 0.03*delta, 1.05*delta, 2);
- }
- void RenderScene(void)//прорисовка окна
- {
- glClearColor(0.99, 1, 0.65, 0.82);//устанавливает цвет, которым будет заполнен буфер кадра
- glClear(GL_COLOR_BUFFER_BIT);
- if (MEAutoRotateVleft)
- MEangleV += 0.5;
- if (MEAutoRotateVright)
- MEangleV -= 0.5;
- if (MEAutoRotateLleft)
- MEangleL += 0.5;
- if (MEAutoRotateLright)
- MEangleL -= 0.5;
- if (CENTERAutoRotateVleft)
- angleV += 0.5;
- if (CENTERAutoRotateVright)
- angleV -= 0.5;
- if (CENTERAutoRotateLleft)
- angleL += 0.5;
- if (CENTERAutoRotateLright)
- angleL -= 0.5;
- glLoadIdentity();//заменяет текущую матрицу на единичную
- glRotatef(angleL, 0., 0., 1.);//производит поворот объекта против часовой стрелки на угол angle (в градусах) вокруг вектора (x, y, z)
- glTranslatef(Lx, Ly, 0);//производит перенос объекта, прибавляя к координатам его вершин значения своих параметров
- glRotatef(MEangleL, 0., 0., 1.);
- Lobas(60.);
- glLoadIdentity();
- glRotatef(angleV, 0., 0., 1.);
- glTranslatef(Vx, Vy, 0);
- glRotatef(MEangleV, 0., 0., 1.);
- Victor(78.);
- glutSwapBuffers();
- }
- void ChangeWindowSize(int w, int h)//обработка изменений окна
- {
- glViewport(0, 0, w, h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(-w / 2, w / 2, -h / 2, h / 2);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void DetectKeys(unsigned char key, int x, int y)
- {
- switch (key)
- {
- case 'w': {
- Vy += 10;
- break;
- }
- case 's': {
- Vy -= 10;
- break;
- }
- case 'a': {
- Vx -= 10;
- break;
- }
- case 'd': {
- Vx += 10;
- break;
- }
- case 'i': {
- Ly += 10;
- break;
- }
- case 'k': {
- Ly -= 10;
- break;
- }
- case 'j': {
- Lx -= 10;
- break;
- }
- case 'l': {
- Lx += 10;
- break;
- }
- case 'x': {
- LletterR = rand() % 256;
- LletterG = rand() % 256;
- LletterB = rand() % 256;
- ContourLletterR = rand() % 256;
- ContourLletterG = rand() % 256;
- ContourLletterB = rand() % 256;
- break;
- }
- case 'z': {
- VletterR = rand() % 256;
- VletterG = rand() % 256;
- VletterB = rand() % 256;
- ContourVletterR = rand() % 256;
- ContourVletterG = rand() % 256;
- ContourVletterB = rand() % 256;
- break;
- }
- case 'c': {
- LletterR = DLletterR;
- LletterG = DLletterG;
- LletterB = DLletterB;
- ContourLletterR = DContourLletterR;
- ContourLletterG = DContourLletterG;
- ContourLletterB = DContourLletterB;
- VletterR = DVletterR;
- VletterG = DVletterG;
- VletterB = DVletterB;
- ContourVletterR = DContourVletterR;
- ContourVletterG = DContourVletterG;
- ContourVletterB = DContourVletterB;
- break;
- }
- }
- }
- void DetectSpecKeys(int key, int x, int y)
- {
- switch (key)
- {
- case GLUT_KEY_UP: {
- Vy += 10;
- Ly += 10;
- break;
- }
- case GLUT_KEY_DOWN: {
- Vy -= 10;
- Ly -= 10;
- break;
- }
- case GLUT_KEY_LEFT: {
- Vx -= 10;
- Lx -= 10;
- break;
- }
- case GLUT_KEY_RIGHT: {
- Vx += 10;
- Lx += 10;
- break;
- }
- case GLUT_KEY_PAGE_UP: {
- angleV -= 10;
- angleL -= 10;
- if (angleV > 360)
- angleV -= 360;
- if (angleV < -360)
- angleV += 360;
- if (angleL > 360)
- angleL -= 360;
- if (angleL < -360)
- angleL += 360;
- break;
- }
- case GLUT_KEY_PAGE_DOWN: {
- angleV += 10;
- angleL += 10;
- if (angleV > 360)
- angleV -= 360;
- if (angleV < -360)
- angleV += 360;
- if (angleL > 360)
- angleL -= 360;
- if (angleL < -360)
- angleL += 360;
- break;
- }
- case GLUT_KEY_F1: {
- MEangleV -= 10;
- if (MEangleV > 360)
- MEangleV -= 360;
- if (MEangleV < -360)
- MEangleV += 360;
- break;
- }
- case GLUT_KEY_F2: {
- MEangleV += 10;
- if (MEangleV > 360)
- MEangleV -= 360;
- if (MEangleV < -360)
- MEangleV += 360;
- break;
- }
- case GLUT_KEY_F10: {
- MEangleL -= 10;
- if (MEangleV > 360)
- MEangleV -= 360;
- if (MEangleV < -360)
- MEangleV += 360;
- break;
- }
- case GLUT_KEY_F11: {
- MEangleL += 10;
- if (MEangleV > 360)
- MEangleV -= 360;
- if (MEangleV < -360)
- MEangleV += 360;
- break;
- }
- case GLUT_KEY_HOME: {
- Vx = DVx;
- Vy = DVy;
- Lx = DLx;
- Ly = DLy;
- angleV = 0.;
- angleL = 0.;
- MEangleV = 0.;
- MEangleL = 0.;
- break;
- }
- case GLUT_KEY_F7: {
- if (CENTERAutoRotateVleft)
- CENTERAutoRotateVleft = false;
- else
- CENTERAutoRotateVleft = true;
- if (CENTERAutoRotateLleft)
- CENTERAutoRotateLleft = false;
- else
- CENTERAutoRotateLleft = true;
- break;
- }
- case GLUT_KEY_F6: {
- if (CENTERAutoRotateVright)
- CENTERAutoRotateVright = false;
- else
- CENTERAutoRotateVright = true;
- if (CENTERAutoRotateLright)
- CENTERAutoRotateLright = false;
- else
- CENTERAutoRotateLright = true;
- break;
- }
- case GLUT_KEY_F8: {
- if (MEAutoRotateVleft)
- MEAutoRotateVleft = false;
- else
- MEAutoRotateVleft = true;
- if (MEAutoRotateLright)
- MEAutoRotateLright = false;
- else
- MEAutoRotateLright = true;
- break;
- }
- case GLUT_KEY_END: {
- exit(0);
- break; }
- }
- }
- int main(int argc, char* argv[])
- {
- srand(time(0));
- ContourLletterR = DContourLletterR = 1;
- ContourLletterG = DContourLletterG = 1;
- ContourLletterB = DContourLletterB = 1;
- LletterR = DLletterR = 30;
- LletterG = DLletterG = 199;
- LletterB = DLletterB = 114;
- ContourVletterR = DContourVletterR = 1;
- ContourVletterG = DContourVletterG = 1;
- ContourVletterB = DContourVletterB = 1;
- VletterR = DVletterR = 100;
- VletterG = DVletterG = 1;
- VletterB = DVletterB = 1;
- Vx = DVx = -70;
- Vy = DVy = 50;
- Lx = DLx = 70;
- Ly = DLy = -50;
- angleV = angleL = MEangleV = MEangleL = 0.;
- CENTERAutoRotateVleft = CENTERAutoRotateVright = CENTERAutoRotateLleft = CENTERAutoRotateLright = false;
- MEAutoRotateVleft = MEAutoRotateVright = MEAutoRotateLleft = MEAutoRotateLright = false;
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
- glutInitWindowSize(800, 600);
- glutInitWindowPosition(10, 10);
- glutCreateWindow("Victor Lobas, PK-15-1");
- glutDisplayFunc(RenderScene);//функция рисования
- glutIdleFunc(RenderScene);//функция для автоматической анимации(автоматический поворот)
- glutReshapeFunc(ChangeWindowSize); //функция обработки изменения размеров окна
- glutSpecialFunc(DetectSpecKeys); //реагирует на нажатие специальных клавиш
- glutKeyboardFunc(DetectKeys);//задает функцию, которая обрабатывает прерывания от клавиатуры
- glutMainLoop();
- return 0;
- }
- //z - смена цвета буквы В
- //x - смена цвета буквы Л
- //c - возврат к цвету по умолчанию для обеих букв
- // стрелка вверх - обе буквы вверх на 10 точек
- // стрелка вниз - обе буквы вниз на 10 точек
- // стрелка вправо - обе буквы вправо на 10 точек
- // стрелка влево - обе буквы влево на 10 точек
- // a - движение В влево
- // d - движение В вправо
- // w - движение В вверх
- // s - движение В вниз
- // j - движение Л влево
- // l - движение Л вправо
- // i - движение Л вверх
- // k - движение Л вниз
- // page up - поворот обеих букв по часовой стрелки
- // page down - поворот обеих букв против часовой стрелке
- // f1 - поворот В по часовой стрелки
- // f2 - поворот В против часовой стрелке
- // f6 - автоматический поворот по часовой стрелки обеих букв
- // f7 - автоматический поворот против часовой стрелке обеих букв
- // f8 - автоматический поворот букв вокруг их центров
- // f10 - поворот Л по часовой стрелки
- // f11 - поворот Л против часовой стрелки
- // home - вернуть в исходное положение
- // end - выход
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement