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 A_LetterR, A_LetterG, A_LetterB, S_LetterR, S_LetterG, S_LetterB;
- int DA_LetterR, DA_LetterG, DA_LetterB, DS_LetterR, DS_LetterG, DS_LetterB;
- int ContourA_LetterR, ContourA_LetterG, ContourA_LetterB, ContourS_LetterR, ContourS_LetterG, ContourS_LetterB;
- int DContourA_LetterR, DContourA_LetterG, DContourA_LetterB, DContourS_LetterR, DContourS_LetterG, DContourS_LetterB;
- int Sx, Sy, Ax, Ay;
- int DSx, DSy, DAx, DAy;
- float angleS, angleA, MEangleS, MEangleA;
- bool MEAutoRotateSleft, MEAutoRotateSright, MEAutoRotateAleft, MEAutoRotateAright;
- bool CENTERAutoRotateSleft, CENTERAutoRotateSright, CENTERAutoRotateAleft, CENTERAutoRotateAright;
- void HalfOfCircle(float xc, float yc, float length, int part);
- void Stolniy(float length);
- void Aleksandr(float length);
- void RenderScene(void);
- void ChangeWindowSize(int w, int h);
- void SymbolKeys(unsigned char key, int x, int y);
- void SpecificKeys(int key, int x, int y);
- int main(int argc, char* argv[])
- {
- srand(time(0));
- ContourA_LetterR = DContourA_LetterR = 1;
- ContourA_LetterG = DContourA_LetterG = 1;
- ContourA_LetterB = DContourA_LetterB = 1;
- A_LetterR = DA_LetterR = 20;
- A_LetterG = DA_LetterG = 9;
- A_LetterB = DA_LetterB = 117;
- ContourS_LetterR = DContourS_LetterR = 1;
- ContourS_LetterG = DContourS_LetterG = 1;
- ContourS_LetterB = DContourS_LetterB = 1;
- S_LetterR = DS_LetterR = 255;
- S_LetterG = DS_LetterG = 247;
- S_LetterB = DS_LetterB = 18;
- Sx = DSx = -70;
- Sy = DSy = 50;
- Ax = DAx = 50;
- Ay = DAy = -60;
- angleS = angleA = MEangleS = MEangleA = 0.;
- CENTERAutoRotateSleft = CENTERAutoRotateSright = CENTERAutoRotateAleft = CENTERAutoRotateAright = false;
- MEAutoRotateSleft = MEAutoRotateSright = MEAutoRotateAleft = MEAutoRotateAright = false;
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
- glutInitWindowSize(800, 600);//размер окна
- glutInitWindowPosition(10, 10);
- glutCreateWindow("Aleksandr Stolniy, PK-15-1");
- glutDisplayFunc(RenderScene);//функция рисования
- glutIdleFunc(RenderScene);//функция для автоматической анимации(автоматический поворот)
- glutReshapeFunc(ChangeWindowSize); //функция обработки изменения размеров окна
- glutSpecialFunc(SpecificKeys); //реагирует на нажатие специальных клавиш
- glutKeyboardFunc(SymbolKeys);//задает функцию, которая обрабатывает прерывания от клавиатуры
- glutMainLoop();
- return 0;
- }
- void HalfOfCircle(float xc, float yc, float length, int part)
- {
- float distance = length;
- float x, y, dxt;
- long r2, dst, t, s, e, ca, cd, indx;
- r2 = (long)length * (long)length;
- dst = 4 * r2;
- dxt = (double)length / 1.414213562373;
- t = 0;
- s = (-4) * r2 * (long)length;
- e = (-1)*s / 2. - 3 * r2;
- ca = (-6)*r2;
- cd = (-10)*r2;
- x = 0;
- y = length;
- 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 - x, yc - y);
- glVertex2f(xc - y, yc - x);
- glVertex2f(xc - y, yc + x);
- glVertex2f(xc - x, yc + y);
- }
- if (part == 2){
- 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;
- }
- }
- void Stolniy(float length)
- {
- // big letter
- glColor3ub(ContourS_LetterR, ContourS_LetterG, ContourS_LetterB);
- HalfOfCircle(0.3 * length, 2.3*length - 0.7*length, 1 * length + 0.1*length, 1);
- HalfOfCircle(0.3 * length, -1 * length - 0.7*length, 1 * length + 0.1*length, 1);
- HalfOfCircle(2. * length, 2.8 * length - 0.7*length, 0.51 * length + 0.1*length, 2);
- HalfOfCircle(2. * length, -1.5 * length - 0.7*length, 0.51 * length + 0.1*length, 2);
- glBegin(GL_POLYGON);
- glVertex2f(0.2 * length - 0.1*length, 2.3*length - 0.1*length - 0.7*length);
- glVertex2f(0.2 * length - 0.1*length, 3.3*length + 0.09*length - 0.7*length);
- glVertex2f(2.1 * length + 0.1*length, 3.3*length + 0.09*length - 0.7*length);
- glVertex2f(2.1 * length + 0.1*length, 2.3*length - 0.1*length - 0.7*length);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(-0.7*length - 0.1*length, -1.*length - 0.1*length - 0.7*length);
- glVertex2f(-0.7*length - 0.1*length, 2.3*length + 0.1*length - 0.7*length);
- glVertex2f(0.3*length + 0.1*length, 2.3*length + 0.1*length - 0.7*length);
- glVertex2f(0.3*length + 0.1*length, -1.*length - 0.1*length - 0.7*length);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(0.2 * length - 0.1*length, -1.*length + 0.1*length - 0.7*length);
- glVertex2f(0.2 * length - 0.1*length, -2.*length - 0.08*length - 0.7*length);
- glVertex2f(2.1 * length + 0.1*length, -2.*length - 0.08*length - 0.7*length);
- glVertex2f(2.1 * length + 0.1*length, -1.*length + 0.1*length - 0.7*length);
- glEnd();
- //small letter
- glColor3ub(S_LetterR, S_LetterG, S_LetterB);
- HalfOfCircle(0.3 * length, 2.3*length - 0.7*length, 1 * length, 1);
- HalfOfCircle(0.3 * length, -1 * length - 0.7*length, 1 * length, 1);
- HalfOfCircle(2. * length, 2.8 * length - 0.7*length, 0.51 * length, 2);
- HalfOfCircle(2. * length, -1.5 * length - 0.7*length, 0.51 * length, 2);
- glBegin(GL_POLYGON);
- glVertex2f(0.2 * length, 2.3*length - 0.7*length);
- glVertex2f(0.2 * length, 3.3*length - 0.7*length);
- glVertex2f(2.1 * length, 3.3*length - 0.7*length);
- glVertex2f(2.1 * length, 2.3*length - 0.7*length);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(-0.7*length, -1.*length - 0.7*length);
- glVertex2f(-0.7*length, 2.3*length - 0.7*length);
- glVertex2f(0.3*length, 2.3*length - 0.7*length);
- glVertex2f(0.3*length, -1.*length - 0.7*length);
- glEnd();
- glBegin(GL_POLYGON);
- glVertex2f(0.2 * length, -1.*length - 0.7*length);
- glVertex2f(0.2 * length, -2.*length - 0.7*length);
- glVertex2f(2.1 * length, -2.*length - 0.7*length);
- glVertex2f(2.1 * length, -1.*length - 0.7*length);
- glEnd();
- }
- void Aleksandr(float length)
- {
- //big letter
- glColor3ub(ContourA_LetterR, ContourA_LetterG, ContourA_LetterB);
- //перекладина
- glBegin(GL_POLYGON);
- glVertex2f(length * (-1.8) - 0.1*length, -1.1 * length - 0.1*length);//left bottom
- glVertex2f(length * (-1.6), -0.1 * length + 0.1*length);//left top
- glVertex2f(length * (1.4), -0.1 * length + 0.1*length);//right top
- glVertex2f(length * (1.8), -1.1 * length - 0.1*length);//right bottom
- glEnd();
- //левая наклонная
- glBegin(GL_POLYGON);
- glVertex2f(length * (-2.45) - 0.1 * length, -2.6 * length - 0.1 * length);//left bottom
- glVertex2f(length * (-1.1) - 0.1 * length, 2. * length + 0.1 * length);//left top
- glVertex2f(length * (-0.7) + length * 0.5 + 0.1 * length, 2 * length + 0.1 * length);//right top
- glVertex2f(length * (-0.7) - length * 0.8 + 0.1 * length, -2.6 * length - 0.1 * length);//right bottom
- glEnd();
- //правая наклонная
- glBegin(GL_POLYGON);
- glVertex2f(length * (1.4) - 0.1 * length, -2.6 * length - 0.1 * length);//left bottom
- glVertex2f(length * (-0.2) - 0.1 * length, 2 * length + 0.1 * length);//left top
- glVertex2f(length * (0.8) + 0.1 * length, 2 * length + 0.1 * length);//right top
- glVertex2f(length * (2.35) + 0.1 * length, -2.6 * length - 0.1 * length);//right bottom
- glEnd();
- //трапеция сверху
- glBegin(GL_POLYGON);
- glVertex2f(length * (-1.1) - 0.1 * length, 2. * length + 0.1 * length);//left bottom
- glVertex2f(length * (-0.8) - 0.1 * length, 3 * length + 0.1 * length);//left top
- glVertex2f(length * (0.5) + 0.1 * length, 3 * length + 0.1 * length);//right top
- glVertex2f(length * (0.8) + 0.1 * length, 2 * length + 0.1 * length);//right bottom
- glEnd();
- //small letter
- glColor3ub(A_LetterR, A_LetterG, A_LetterB);
- //перекладина
- glBegin(GL_POLYGON);
- glVertex2f(length * (-1.8), -1.1 * length);//left bottom
- glVertex2f(length * (-1.6), -0.1 * length);//left top
- glVertex2f(length * (1.4), -0.1 * length);//right top
- glVertex2f(length * (1.8), -1.1 * length);//right bottom
- glEnd();
- //левая наклонная
- glBegin(GL_POLYGON);
- glVertex2f(length * (-2.4), -2.6 * length);//left bottom
- glVertex2f(length * (-1.1), 2. * length);//left top
- glVertex2f(length * (-0.7) + length * 0.5, 2 * length);//right top
- glVertex2f(length * (-0.7) - length * 0.8, -2.6 * length);//right bottom
- glEnd();
- //правая наклонная
- glBegin(GL_POLYGON);
- glVertex2f(length * (1.4), -2.6 * length);//left bottom
- glVertex2f(length * (-0.2), 2 * length);//left top
- glVertex2f(length * (0.8), 2 * length);//right top
- glVertex2f(length * (2.3), -2.6 * length);//right bottom
- glEnd();
- //трапеция сверху
- glBegin(GL_POLYGON);
- glVertex2f(length * (-1.1), 2. * length);//left bottom
- glVertex2f(length * (-0.8), 3 * length);//left top
- glVertex2f(length * (0.5), 3 * length);//right top
- glVertex2f(length * (0.8), 2 * length);//right bottom
- glEnd();
- }
- void RenderScene(void)//прорисовка окна
- {
- glClearColor(0.5, 0.79, 0.51, 0.81);//устанавливает цвет, которым будет заполнен буфер кадра
- glClear(GL_COLOR_BUFFER_BIT);//очищает буферы, а параметр определяет комбинацию констант, соответствующую буферам, которые нужно очистить
- if (MEAutoRotateSleft)
- MEangleS += 0.5;
- if (MEAutoRotateSright)
- MEangleS -= 0.5;
- if (MEAutoRotateAleft)
- MEangleA += 0.5;
- if (MEAutoRotateAright)
- MEangleA -= 0.5;
- if (CENTERAutoRotateSleft)
- angleS += 0.5;
- if (CENTERAutoRotateSright)
- angleS -= 0.5;
- if (CENTERAutoRotateAleft)
- angleA += 0.5;
- if (CENTERAutoRotateAright)
- angleA -= 0.5;
- glLoadIdentity();//заменяет текущую матрицу на единичную
- glRotatef(angleA, 0., 0., 1.);//производит поворот объекта против часовой стрелки на угол angle (в градусах) вокруг вектора (x, y, z)
- glTranslatef(Ax, Ay, 0);//производит перенос объекта, прибавляя к координатам его вершин значения своих параметров
- glRotatef(MEangleA, 0., 0., 1.); //производит поворот объекта против часовой стрелки на угол angle(в градусах) вокруг вектора(x, y, z)
- Stolniy(55.);
- glLoadIdentity();
- glRotatef(angleS, 0., 0., 1.);
- glTranslatef(Sx, Sy, 0);
- glRotatef(MEangleS, 0., 0., 1.);
- Aleksandr(50.);
- 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 SymbolKeys(unsigned char key, int x, int y)
- {
- switch (key)
- {
- case 'w': {
- Sy += 10;
- break;
- }
- case 's': {
- Sy -= 10;
- break;
- }
- case 'a': {
- Sx -= 10;
- break;
- }
- case 'd': {
- Sx += 10;
- break;
- }
- case 'i': {
- Ay += 10;
- break;
- }
- case 'k': {
- Ay -= 10;
- break;
- }
- case 'j': {
- Ax -= 10;
- break;
- }
- case 'l': {
- Ax += 10;
- break;
- }
- case 'z': {
- A_LetterR = rand() % 256;
- A_LetterG = rand() % 256;
- A_LetterB = rand() % 256;
- ContourA_LetterR = rand() % 256;
- ContourA_LetterG = rand() % 256;
- ContourA_LetterB = rand() % 256;
- break;
- }
- case 'x': {
- S_LetterR = rand() % 256;
- S_LetterG = rand() % 256;
- S_LetterB = rand() % 256;
- ContourS_LetterR = rand() % 256;
- ContourS_LetterG = rand() % 256;
- ContourS_LetterB = rand() % 256;
- break;
- }
- case 'c': {
- A_LetterR = DA_LetterR;
- A_LetterG = DA_LetterG;
- A_LetterB = DA_LetterB;
- ContourA_LetterR = DContourA_LetterR;
- ContourA_LetterG = DContourA_LetterG;
- ContourA_LetterB = DContourA_LetterB;
- S_LetterR = DS_LetterR;
- S_LetterG = DS_LetterG;
- S_LetterB = DS_LetterB;
- ContourS_LetterR = DContourS_LetterR;
- ContourS_LetterG = DContourS_LetterG;
- ContourS_LetterB = DContourS_LetterB;
- break;
- }
- }
- }
- void SpecificKeys(int key, int x, int y)
- {
- switch (key)
- {
- case GLUT_KEY_UP: {
- Sy += 10;
- Ay += 10;
- break;
- }
- case GLUT_KEY_DOWN: {
- Sy -= 10;
- Ay -= 10;
- break;
- }
- case GLUT_KEY_LEFT: {
- Sx -= 10;
- Ax -= 10;
- break;
- }
- case GLUT_KEY_RIGHT: {
- Sx += 10;
- Ax += 10;
- break;
- }
- case GLUT_KEY_PAGE_UP: {
- angleS -= 10;
- angleA -= 10;
- if (angleS > 360)
- angleS -= 360;
- if (angleS < -360)
- angleS += 360;
- if (angleA > 360)
- angleA -= 360;
- if (angleA < -360)
- angleA += 360;
- break;
- }
- case GLUT_KEY_PAGE_DOWN: {
- angleS += 10;
- angleA += 10;
- if (angleS > 360)
- angleS -= 360;
- if (angleS < -360)
- angleS += 360;
- if (angleA > 360)
- angleA -= 360;
- if (angleA < -360)
- angleA += 360;
- break;
- }
- case GLUT_KEY_F1: {
- MEangleS -= 10;
- if (MEangleS > 360)
- MEangleS -= 360;
- if (MEangleS < -360)
- MEangleS += 360;
- break;
- }
- case GLUT_KEY_F2: {
- MEangleS += 10;
- if (MEangleS > 360)
- MEangleS -= 360;
- if (MEangleS < -360)
- MEangleS += 360;
- break;
- }
- case GLUT_KEY_F11: {
- MEangleA += 10;
- if (MEangleS > 360)
- MEangleS -= 360;
- if (MEangleS < -360)
- MEangleS += 360;
- break;
- }
- case GLUT_KEY_F10: {
- MEangleA -= 10;
- if (MEangleS > 360)
- MEangleS -= 360;
- if (MEangleS < -360)
- MEangleS += 360;
- break;
- }
- case GLUT_KEY_HOME: {
- Sx = DSx;
- Sy = DSy;
- Ax = DAx;
- Ay = DAy;
- angleS = 0.;
- angleA = 0.;
- MEangleS = 0.;
- MEangleA = 0.;
- break;
- }
- case GLUT_KEY_F7: {
- if (CENTERAutoRotateSleft)
- CENTERAutoRotateSleft = false;
- else
- CENTERAutoRotateSleft = true;
- if (CENTERAutoRotateAleft)
- CENTERAutoRotateAleft = false;
- else
- CENTERAutoRotateAleft = true;
- break;
- }
- case GLUT_KEY_F6: {
- if (CENTERAutoRotateSright)
- CENTERAutoRotateSright = false;
- else
- CENTERAutoRotateSright = true;
- if (CENTERAutoRotateAright)
- CENTERAutoRotateAright = false;
- else
- CENTERAutoRotateAright = true;
- break;
- }
- case GLUT_KEY_F8: {
- if (MEAutoRotateSleft)
- MEAutoRotateSleft = false;
- else
- MEAutoRotateSleft = true;
- if (MEAutoRotateAright)
- MEAutoRotateAright = false;
- else
- MEAutoRotateAright = true;
- break;
- }
- case GLUT_KEY_END: {
- exit(0);
- break; }
- }
- }
- //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