Advertisement
MargaritaOwl

GLUT_lab_Stoltiy

Nov 4th, 2017
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.38 KB | None | 0 0
  1. #pragma comment(lib, "opengl32.lib")
  2. #pragma comment(lib, "glut32.lib")
  3. #pragma comment(lib, "glu32.lib")
  4. #include <glut.h>
  5. #include <ctime>
  6. #include <stdlib.h>
  7.  
  8. int A_LetterR, A_LetterG, A_LetterB, S_LetterR, S_LetterG, S_LetterB;
  9. int DA_LetterR, DA_LetterG, DA_LetterB, DS_LetterR, DS_LetterG, DS_LetterB;
  10. int ContourA_LetterR, ContourA_LetterG, ContourA_LetterB, ContourS_LetterR, ContourS_LetterG, ContourS_LetterB;
  11. int DContourA_LetterR, DContourA_LetterG, DContourA_LetterB, DContourS_LetterR, DContourS_LetterG, DContourS_LetterB;
  12. int Sx, Sy, Ax, Ay;
  13. int DSx, DSy, DAx, DAy;
  14. float angleS, angleA, MEangleS, MEangleA;
  15. bool MEAutoRotateSleft, MEAutoRotateSright, MEAutoRotateAleft, MEAutoRotateAright;
  16. bool CENTERAutoRotateSleft, CENTERAutoRotateSright, CENTERAutoRotateAleft, CENTERAutoRotateAright;
  17.  
  18. void HalfOfCircle(float xc, float yc, float length, int part);
  19. void Stolniy(float length);
  20. void Aleksandr(float length);
  21. void RenderScene(void);
  22. void ChangeWindowSize(int w, int h);
  23. void SymbolKeys(unsigned char key, int x, int y);
  24. void SpecificKeys(int key, int x, int y);
  25.  
  26.  
  27. int main(int argc, char* argv[])
  28. {
  29.     srand(time(0));
  30.     ContourA_LetterR = DContourA_LetterR = 1;
  31.     ContourA_LetterG = DContourA_LetterG = 1;
  32.     ContourA_LetterB = DContourA_LetterB = 1;
  33.     A_LetterR = DA_LetterR = 20;
  34.     A_LetterG = DA_LetterG = 9;
  35.     A_LetterB = DA_LetterB = 117;
  36.  
  37.     ContourS_LetterR = DContourS_LetterR = 1;
  38.     ContourS_LetterG = DContourS_LetterG = 1;
  39.     ContourS_LetterB = DContourS_LetterB = 1;
  40.     S_LetterR = DS_LetterR = 255;
  41.     S_LetterG = DS_LetterG = 247;
  42.     S_LetterB = DS_LetterB = 18;
  43.  
  44.     Sx = DSx = -70;
  45.     Sy = DSy = 50;
  46.     Ax = DAx = 50;
  47.     Ay = DAy = -60;
  48.     angleS = angleA = MEangleS = MEangleA = 0.;
  49.     CENTERAutoRotateSleft = CENTERAutoRotateSright = CENTERAutoRotateAleft = CENTERAutoRotateAright = false;
  50.     MEAutoRotateSleft = MEAutoRotateSright = MEAutoRotateAleft = MEAutoRotateAright = false;
  51.  
  52.     glutInit(&argc, argv);
  53.     glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  54.     glutInitWindowSize(800, 600);//размер окна
  55.     glutInitWindowPosition(10, 10);
  56.     glutCreateWindow("Aleksandr Stolniy, PK-15-1");
  57.  
  58.     glutDisplayFunc(RenderScene);//функция рисования
  59.     glutIdleFunc(RenderScene);//функция для автоматической анимации(автоматический поворот)
  60.     glutReshapeFunc(ChangeWindowSize); //функция обработки изменения размеров окна
  61.     glutSpecialFunc(SpecificKeys); //реагирует на нажатие специальных клавиш
  62.     glutKeyboardFunc(SymbolKeys);//задает функцию, которая обрабатывает прерывания от клавиатуры
  63.     glutMainLoop();
  64.  
  65.     return 0;
  66. }
  67.  
  68. void HalfOfCircle(float xc, float yc, float length, int part)
  69. {
  70.     float distance = length;
  71.     float x, y, dxt;
  72.     long r2, dst, t, s, e, ca, cd, indx;
  73.  
  74.     r2 = (long)length * (long)length;
  75.     dst = 4 * r2;
  76.     dxt = (double)length / 1.414213562373;
  77.     t = 0;
  78.     s = (-4) * r2 * (long)length;
  79.     e = (-1)*s / 2. - 3 * r2;
  80.     ca = (-6)*r2;
  81.     cd = (-10)*r2;
  82.     x = 0;
  83.     y = length;
  84.  
  85.     float xPre, yPre;
  86.     for (indx = 1; indx <= dxt; indx++)
  87.     {
  88.         x++;
  89.         if (e >= 0)
  90.             e += t + ca;
  91.         else{
  92.             y--;
  93.             e += t - s + cd;
  94.             s += dst;
  95.         }
  96.         t -= dst;
  97.  
  98.         if (indx != 1)
  99.         {
  100.             glBegin(GL_QUADS);
  101.             if (part == 1){
  102.                 glVertex2f(xc - x, yc - y);
  103.                 glVertex2f(xc - y, yc - x);
  104.                 glVertex2f(xc - y, yc + x);
  105.                 glVertex2f(xc - x, yc + y);
  106.             }
  107.             if (part == 2){
  108.                 glVertex2f(xc + x, yc + y);
  109.                 glVertex2f(xc + y, yc + x);
  110.                 glVertex2f(xc + y, yc - x);
  111.                 glVertex2f(xc + x, yc - y);
  112.             }
  113.             glEnd();
  114.         }
  115.         xPre = x;
  116.         yPre = y;
  117.     }
  118. }
  119. void Stolniy(float length)
  120. {
  121.     // big letter
  122.     glColor3ub(ContourS_LetterR, ContourS_LetterG, ContourS_LetterB);
  123.     HalfOfCircle(0.3 * length, 2.3*length - 0.7*length, 1 * length + 0.1*length, 1);
  124.     HalfOfCircle(0.3 * length, -1 * length - 0.7*length, 1 * length + 0.1*length, 1);
  125.     HalfOfCircle(2. * length, 2.8 * length - 0.7*length, 0.51 * length + 0.1*length, 2);
  126.     HalfOfCircle(2. * length, -1.5 * length - 0.7*length, 0.51 * length + 0.1*length, 2);
  127.  
  128.     glBegin(GL_POLYGON);
  129.     glVertex2f(0.2 * length - 0.1*length, 2.3*length - 0.1*length - 0.7*length);
  130.     glVertex2f(0.2 * length - 0.1*length, 3.3*length + 0.09*length - 0.7*length);
  131.     glVertex2f(2.1 * length + 0.1*length, 3.3*length + 0.09*length - 0.7*length);
  132.     glVertex2f(2.1 * length + 0.1*length, 2.3*length - 0.1*length - 0.7*length);
  133.     glEnd();
  134.  
  135.     glBegin(GL_POLYGON);
  136.     glVertex2f(-0.7*length - 0.1*length, -1.*length - 0.1*length - 0.7*length);
  137.     glVertex2f(-0.7*length - 0.1*length, 2.3*length + 0.1*length - 0.7*length);
  138.     glVertex2f(0.3*length + 0.1*length, 2.3*length + 0.1*length - 0.7*length);
  139.     glVertex2f(0.3*length + 0.1*length, -1.*length - 0.1*length - 0.7*length);
  140.     glEnd();
  141.  
  142.     glBegin(GL_POLYGON);
  143.     glVertex2f(0.2 * length - 0.1*length, -1.*length + 0.1*length - 0.7*length);
  144.     glVertex2f(0.2 * length - 0.1*length, -2.*length - 0.08*length - 0.7*length);
  145.     glVertex2f(2.1 * length + 0.1*length, -2.*length - 0.08*length - 0.7*length);
  146.     glVertex2f(2.1 * length + 0.1*length, -1.*length + 0.1*length - 0.7*length);
  147.     glEnd();
  148.  
  149.     //small letter
  150.     glColor3ub(S_LetterR, S_LetterG, S_LetterB);
  151.     HalfOfCircle(0.3 * length, 2.3*length - 0.7*length, 1 * length, 1);
  152.     HalfOfCircle(0.3 * length, -1 * length - 0.7*length, 1 * length, 1);
  153.     HalfOfCircle(2. * length, 2.8 * length - 0.7*length, 0.51 * length, 2);
  154.     HalfOfCircle(2. * length, -1.5 * length - 0.7*length, 0.51 * length, 2);
  155.  
  156.     glBegin(GL_POLYGON);
  157.     glVertex2f(0.2 * length, 2.3*length - 0.7*length);
  158.     glVertex2f(0.2 * length, 3.3*length - 0.7*length);
  159.     glVertex2f(2.1 * length, 3.3*length - 0.7*length);
  160.     glVertex2f(2.1 * length, 2.3*length - 0.7*length);
  161.     glEnd();
  162.  
  163.     glBegin(GL_POLYGON);
  164.     glVertex2f(-0.7*length, -1.*length - 0.7*length);
  165.     glVertex2f(-0.7*length, 2.3*length - 0.7*length);
  166.     glVertex2f(0.3*length, 2.3*length - 0.7*length);
  167.     glVertex2f(0.3*length, -1.*length - 0.7*length);
  168.     glEnd();
  169.  
  170.     glBegin(GL_POLYGON);
  171.     glVertex2f(0.2 * length, -1.*length - 0.7*length);
  172.     glVertex2f(0.2 * length, -2.*length - 0.7*length);
  173.     glVertex2f(2.1 * length, -2.*length - 0.7*length);
  174.     glVertex2f(2.1 * length, -1.*length - 0.7*length);
  175.     glEnd();
  176.  
  177. }
  178. void Aleksandr(float length)
  179. {
  180.     //big letter
  181.     glColor3ub(ContourA_LetterR, ContourA_LetterG, ContourA_LetterB);
  182.     //перекладина
  183.     glBegin(GL_POLYGON);
  184.     glVertex2f(length * (-1.8) - 0.1*length, -1.1 * length - 0.1*length);//left bottom
  185.     glVertex2f(length * (-1.6), -0.1 * length + 0.1*length);//left top
  186.     glVertex2f(length * (1.4), -0.1 * length + 0.1*length);//right top
  187.     glVertex2f(length * (1.8), -1.1 * length - 0.1*length);//right bottom
  188.     glEnd();
  189.     //левая наклонная
  190.     glBegin(GL_POLYGON);
  191.     glVertex2f(length * (-2.45) - 0.1 * length, -2.6 * length - 0.1 * length);//left bottom
  192.     glVertex2f(length * (-1.1) - 0.1 * length, 2. * length + 0.1 * length);//left top
  193.     glVertex2f(length * (-0.7) + length * 0.5 + 0.1 * length, 2 * length + 0.1 * length);//right top
  194.     glVertex2f(length * (-0.7) - length * 0.8 + 0.1 * length, -2.6 * length - 0.1 * length);//right bottom
  195.     glEnd();
  196.     //правая наклонная
  197.     glBegin(GL_POLYGON);
  198.     glVertex2f(length * (1.4) - 0.1 * length, -2.6 * length - 0.1 * length);//left bottom
  199.     glVertex2f(length * (-0.2) - 0.1 * length, 2 * length + 0.1 * length);//left top
  200.     glVertex2f(length * (0.8) + 0.1 * length, 2 * length + 0.1 * length);//right top
  201.     glVertex2f(length * (2.35) + 0.1 * length, -2.6 * length - 0.1 * length);//right bottom
  202.     glEnd();
  203.     //трапеция сверху
  204.     glBegin(GL_POLYGON);
  205.     glVertex2f(length * (-1.1) - 0.1 * length, 2. * length + 0.1 * length);//left bottom
  206.     glVertex2f(length * (-0.8) - 0.1 * length, 3 * length + 0.1 * length);//left top
  207.     glVertex2f(length * (0.5) + 0.1 * length, 3 * length + 0.1 * length);//right top
  208.     glVertex2f(length * (0.8) + 0.1 * length, 2 * length + 0.1 * length);//right bottom
  209.     glEnd();
  210.  
  211.  
  212.     //small letter
  213.     glColor3ub(A_LetterR, A_LetterG, A_LetterB);
  214.     //перекладина
  215.     glBegin(GL_POLYGON);
  216.     glVertex2f(length * (-1.8), -1.1 * length);//left bottom
  217.     glVertex2f(length * (-1.6), -0.1 * length);//left top
  218.     glVertex2f(length * (1.4), -0.1 * length);//right top
  219.     glVertex2f(length * (1.8), -1.1 * length);//right bottom
  220.     glEnd();
  221.     //левая наклонная
  222.     glBegin(GL_POLYGON);
  223.     glVertex2f(length * (-2.4), -2.6 * length);//left bottom
  224.     glVertex2f(length * (-1.1), 2. * length);//left top
  225.     glVertex2f(length * (-0.7) + length * 0.5, 2 * length);//right top
  226.     glVertex2f(length * (-0.7) - length * 0.8, -2.6 * length);//right bottom
  227.     glEnd();
  228.     //правая наклонная
  229.     glBegin(GL_POLYGON);
  230.     glVertex2f(length * (1.4), -2.6 * length);//left bottom
  231.     glVertex2f(length * (-0.2), 2 * length);//left top
  232.     glVertex2f(length * (0.8), 2 * length);//right top
  233.     glVertex2f(length * (2.3), -2.6 * length);//right bottom
  234.     glEnd();
  235.     //трапеция сверху
  236.     glBegin(GL_POLYGON);
  237.     glVertex2f(length * (-1.1), 2. * length);//left bottom
  238.     glVertex2f(length * (-0.8), 3 * length);//left top
  239.     glVertex2f(length * (0.5), 3 * length);//right top
  240.     glVertex2f(length * (0.8), 2 * length);//right bottom
  241.     glEnd();
  242. }
  243. void RenderScene(void)//прорисовка окна
  244. {
  245.     glClearColor(0.5, 0.79, 0.51, 0.81);//устанавливает цвет, которым будет заполнен буфер кадра
  246.     glClear(GL_COLOR_BUFFER_BIT);//очищает буферы, а параметр определяет комбинацию констант, соответствующую буферам, которые нужно очистить
  247.     if (MEAutoRotateSleft)
  248.         MEangleS += 0.5;
  249.     if (MEAutoRotateSright)
  250.         MEangleS -= 0.5;
  251.     if (MEAutoRotateAleft)
  252.         MEangleA += 0.5;
  253.     if (MEAutoRotateAright)
  254.         MEangleA -= 0.5;
  255.  
  256.     if (CENTERAutoRotateSleft)
  257.         angleS += 0.5;
  258.     if (CENTERAutoRotateSright)
  259.         angleS -= 0.5;
  260.     if (CENTERAutoRotateAleft)
  261.         angleA += 0.5;
  262.     if (CENTERAutoRotateAright)
  263.         angleA -= 0.5;
  264.  
  265.     glLoadIdentity();//заменяет текущую матрицу на единичную
  266.     glRotatef(angleA, 0., 0., 1.);//производит поворот объекта против часовой стрелки на угол angle (в градусах) вокруг вектора  (x, y, z)
  267.     glTranslatef(Ax, Ay, 0);//производит перенос объекта, прибавляя к координатам его вершин значения своих параметров
  268.     glRotatef(MEangleA, 0., 0., 1.); //производит поворот объекта против часовой стрелки на угол angle(в градусах) вокруг вектора(x, y, z)
  269.     Stolniy(55.);
  270.  
  271.     glLoadIdentity();
  272.     glRotatef(angleS, 0., 0., 1.);
  273.     glTranslatef(Sx, Sy, 0);
  274.     glRotatef(MEangleS, 0., 0., 1.);
  275.     Aleksandr(50.);
  276.  
  277.     glutSwapBuffers();
  278. }
  279. void ChangeWindowSize(int w, int h)//обработка изменений окна
  280. {
  281.     glViewport(0, 0, w, h);
  282.  
  283.     glMatrixMode(GL_PROJECTION);//для работы с матрицей проекций
  284.     glLoadIdentity(); //заменяет текущую матрицу на единичную
  285.     gluOrtho2D(-w / 2, w / 2, -h / 2, h / 2);
  286.  
  287.     glMatrixMode(GL_MODELVIEW);//для работы с модельно видовой матрицей
  288.     glLoadIdentity();
  289. }
  290. void SymbolKeys(unsigned char key, int x, int y)
  291. {
  292.     switch (key)
  293.     {
  294.     case 'w': {
  295.         Sy += 10;
  296.         break;
  297.     }
  298.     case 's': {
  299.         Sy -= 10;
  300.         break;
  301.     }
  302.     case 'a': {
  303.         Sx -= 10;
  304.         break;
  305.     }
  306.     case 'd': {
  307.         Sx += 10;
  308.         break;
  309.     }
  310.     case 'i': {
  311.         Ay += 10;
  312.         break;
  313.     }
  314.     case 'k': {
  315.         Ay -= 10;
  316.         break;
  317.     }
  318.     case 'j': {
  319.         Ax -= 10;
  320.         break;
  321.     }
  322.     case 'l': {
  323.         Ax += 10;
  324.         break;
  325.     }
  326.     case 'z': {
  327.         A_LetterR = rand() % 256;
  328.         A_LetterG = rand() % 256;
  329.         A_LetterB = rand() % 256;
  330.         ContourA_LetterR = rand() % 256;
  331.         ContourA_LetterG = rand() % 256;
  332.         ContourA_LetterB = rand() % 256;
  333.         break;
  334.     }
  335.     case 'x': {
  336.         S_LetterR = rand() % 256;
  337.         S_LetterG = rand() % 256;
  338.         S_LetterB = rand() % 256;
  339.         ContourS_LetterR = rand() % 256;
  340.         ContourS_LetterG = rand() % 256;
  341.         ContourS_LetterB = rand() % 256;
  342.         break;
  343.     }
  344.     case 'c': {
  345.         A_LetterR = DA_LetterR;
  346.         A_LetterG = DA_LetterG;
  347.         A_LetterB = DA_LetterB;
  348.         ContourA_LetterR = DContourA_LetterR;
  349.         ContourA_LetterG = DContourA_LetterG;
  350.         ContourA_LetterB = DContourA_LetterB;
  351.         S_LetterR = DS_LetterR;
  352.         S_LetterG = DS_LetterG;
  353.         S_LetterB = DS_LetterB;
  354.         ContourS_LetterR = DContourS_LetterR;
  355.         ContourS_LetterG = DContourS_LetterG;
  356.         ContourS_LetterB = DContourS_LetterB;
  357.         break;
  358.     }
  359.     }
  360. }
  361. void SpecificKeys(int key, int x, int y)
  362. {
  363.     switch (key)
  364.     {
  365.     case GLUT_KEY_UP: {
  366.         Sy += 10;
  367.         Ay += 10;
  368.         break;
  369.     }
  370.     case GLUT_KEY_DOWN: {
  371.         Sy -= 10;
  372.         Ay -= 10;
  373.         break;
  374.     }
  375.     case GLUT_KEY_LEFT: {
  376.         Sx -= 10;
  377.         Ax -= 10;
  378.         break;
  379.     }
  380.     case GLUT_KEY_RIGHT: {
  381.         Sx += 10;
  382.         Ax += 10;
  383.         break;
  384.     }
  385.     case GLUT_KEY_PAGE_UP: {
  386.         angleS -= 10;
  387.         angleA -= 10;
  388.         if (angleS > 360)
  389.             angleS -= 360;
  390.         if (angleS < -360)
  391.             angleS += 360;
  392.  
  393.         if (angleA > 360)
  394.             angleA -= 360;
  395.         if (angleA < -360)
  396.             angleA += 360;
  397.         break;
  398.     }
  399.     case GLUT_KEY_PAGE_DOWN: {
  400.         angleS += 10;
  401.         angleA += 10;
  402.         if (angleS > 360)
  403.             angleS -= 360;
  404.         if (angleS < -360)
  405.             angleS += 360;
  406.  
  407.         if (angleA > 360)
  408.             angleA -= 360;
  409.         if (angleA < -360)
  410.             angleA += 360;
  411.         break;
  412.     }
  413.     case GLUT_KEY_F1: {
  414.         MEangleS -= 10;
  415.         if (MEangleS > 360)
  416.             MEangleS -= 360;
  417.         if (MEangleS < -360)
  418.             MEangleS += 360;
  419.         break;
  420.     }
  421.     case GLUT_KEY_F2: {
  422.         MEangleS += 10;
  423.         if (MEangleS > 360)
  424.             MEangleS -= 360;
  425.         if (MEangleS < -360)
  426.             MEangleS += 360;
  427.         break;
  428.     }
  429.     case GLUT_KEY_F11: {
  430.         MEangleA += 10;
  431.         if (MEangleS > 360)
  432.             MEangleS -= 360;
  433.         if (MEangleS < -360)
  434.             MEangleS += 360;
  435.         break;
  436.     }
  437.     case GLUT_KEY_F10: {
  438.         MEangleA -= 10;
  439.         if (MEangleS > 360)
  440.             MEangleS -= 360;
  441.         if (MEangleS < -360)
  442.             MEangleS += 360;
  443.         break;
  444.     }
  445.     case GLUT_KEY_HOME: {
  446.         Sx = DSx;
  447.         Sy = DSy;
  448.         Ax = DAx;
  449.         Ay = DAy;
  450.         angleS = 0.;
  451.         angleA = 0.;
  452.         MEangleS = 0.;
  453.         MEangleA = 0.;
  454.         break;
  455.     }
  456.     case GLUT_KEY_F7: {
  457.         if (CENTERAutoRotateSleft)
  458.             CENTERAutoRotateSleft = false;
  459.         else
  460.             CENTERAutoRotateSleft = true;
  461.         if (CENTERAutoRotateAleft)
  462.             CENTERAutoRotateAleft = false;
  463.         else
  464.             CENTERAutoRotateAleft = true;
  465.         break;
  466.     }
  467.     case GLUT_KEY_F6: {
  468.         if (CENTERAutoRotateSright)
  469.             CENTERAutoRotateSright = false;
  470.         else
  471.             CENTERAutoRotateSright = true;
  472.         if (CENTERAutoRotateAright)
  473.             CENTERAutoRotateAright = false;
  474.         else
  475.             CENTERAutoRotateAright = true;
  476.         break;
  477.     }
  478.     case GLUT_KEY_F8: {
  479.         if (MEAutoRotateSleft)
  480.             MEAutoRotateSleft = false;
  481.         else
  482.             MEAutoRotateSleft = true;
  483.         if (MEAutoRotateAright)
  484.             MEAutoRotateAright = false;
  485.         else
  486.             MEAutoRotateAright = true;
  487.         break;
  488.     }
  489.     case GLUT_KEY_END: {
  490.         exit(0);
  491.         break; }
  492.     }
  493. }
  494.  
  495.  
  496. //z - смена цвета буквы А
  497. //x - смена цвета буквы С
  498. //c - возврат к цвету по умолчанию для обеих букв
  499. // стрелка вверх - обе буквы вверх на 10 точек
  500. // стрелка вниз - обе буквы вниз на 10 точек
  501. // стрелка вправо - обе буквы вправо на 10 точек
  502. // стрелка влево - обе буквы влево на 10 точек
  503. // a - движение А влево
  504. // d - движение А вправо
  505. // w - движение А вверх
  506. // s - движение А вниз
  507. // j - движение С влево
  508. // l - движение С вправо
  509. // i - движение С вверх
  510. // k - движение С вниз
  511. // page up - поворот обеих букв по часовой стрелки
  512. // page down - поворот обеих букв против часовой стрелке
  513. // f1 - поворот А по часовой стрелки
  514. // f2 - поворот А против часовой стрелке
  515. // f6 - автоматический поворот по часовой стрелки обеих букв
  516. // f7 - автоматический поворот против часовой стрелке обеих букв
  517. // f8 - автоматический поворот букв вокруг их центров
  518. // f10 - поворот С по часовой стрелки
  519. // f11 - поворот С против часовой стрелки
  520. // home - вернуть в исходное положение
  521. // end - выход
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement