Advertisement
shek15470

Untitled

Jun 15th, 2021
678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.30 KB | None | 0 0
  1. #include <glad/glad.h>
  2. #include <GLFW/glfw3.h>
  3. #include <iostream>
  4. #include <cmath>
  5. #define pi 3.14159265358979324
  6.  
  7. GLuint upN = 4;
  8. GLfloat right = 0;
  9. GLfloat incR = 0;
  10. GLfloat up = 0;
  11. GLfloat incU = 0;
  12.  
  13. GLfloat red[] = { 1, 0, 0 };
  14. GLfloat blue[] = { 0, 0, 1 };
  15. GLfloat green[] = { 0, 1, 0 };
  16. GLfloat yellow[] = { 1, 1, 0 };
  17. GLfloat white[] = { 1, 1, 1 };
  18. GLfloat grey[] = { 0.2, 0.2, 0.2 };
  19. GLfloat p = 0.1;
  20. GLfloat q = 0.1;
  21. int verts_count = 20;
  22. int z_count = 20;
  23.  
  24.  
  25. bool isFill = 1;
  26. bool v=0;
  27.  
  28. void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {
  29.     if (key == GLFW_KEY_P && action == GLFW_PRESS) {
  30.         upN = upN + 1;
  31.     }
  32.     if (key == GLFW_KEY_O && action == GLFW_PRESS) {
  33.         upN = upN - 1;
  34.     }
  35.     if (key == GLFW_KEY_LEFT && action == GLFW_PRESS) {
  36.         incR = incR - 0.05f;
  37.     }
  38.     if (key == GLFW_KEY_RIGHT && action == GLFW_PRESS) {
  39.         incR = incR + 0.05f;
  40.     }
  41.     if (key == GLFW_KEY_UP && action == GLFW_PRESS) {
  42.         incU = incU + 0.05f;
  43.     }
  44.     if (key == GLFW_KEY_DOWN && action == GLFW_PRESS) {
  45.         incU = incU - 0.05f;
  46.     }
  47.     if (key == GLFW_KEY_Q && action == GLFW_PRESS) {
  48.         isFill = !isFill;
  49.     }
  50.     if (key == GLFW_KEY_P && action == GLFW_PRESS) {
  51.         z_count++;
  52.         if (z_count>30) z_count=30;
  53.         verts_count++;
  54.         if (verts_count>30) verts_count=30;
  55.         v=1;
  56.     }
  57.     if (key == GLFW_KEY_O && action == GLFW_PRESS) {
  58.         z_count--;
  59.         if (z_count<10) z_count=10;
  60.         verts_count--;
  61.         if (verts_count<10) verts_count=10;
  62.         v=1;
  63.     }
  64. }
  65.  
  66. GLfloat V1[] = { 1, -1, -1 };
  67. GLfloat V2[] = { 1, -1, 1 };
  68. GLfloat V3[] = { 1, 1, -1 };
  69. GLfloat V4[] = { 1, 1, 1 };
  70. GLfloat V5[] = { -1, 1, -1 };
  71. GLfloat V6[] = { -1, 1, 1 };
  72. GLfloat V7[] = { -1, -1, -1 };
  73. GLfloat V8[] = { -1, -1, 1 };
  74.  
  75. GLfloat Verts[2800];
  76.  
  77. void giperboloidVerts() {
  78.     for (int i=0; i<=z_count; i++) {
  79.         GLfloat z1 = z_count;
  80.         GLfloat z = -1.1 + (i * 2.2)/z1;
  81.         GLfloat v = atan(z);
  82.         for (int j=0; j<verts_count; j++) {
  83.             GLfloat u = 0 + j * 2*pi/verts_count;
  84.             Verts[3*i*verts_count+j*3] = 1/cos(v) * cos(u);
  85.             Verts[3*i*verts_count+j*3+1] = 1/cos(v) * sin(u);
  86.             Verts[3*i*verts_count+j*3+2] = z;
  87.         }
  88.     }
  89. }
  90.  
  91. void drawGiperboloid() {
  92.     if (isFill) {
  93.         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  94.     }
  95.     else {
  96.         glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  97.     }
  98.     for (int z=0; z<z_count; z++) {
  99.         glColor3f(1,1,1);
  100.         //круги сверху снизу
  101.         if ((z==0) || (z==z_count-1)) {
  102.             if (z==z_count-1) z=z_count;
  103.             for (int j=0; j<verts_count-1; j++){
  104.                 glBegin(GL_TRIANGLES);
  105.                 glVertex3f(Verts[z*verts_count*3+j*3], Verts[z*verts_count*3+j*3+1], Verts[z*verts_count*3+j*3+2]);
  106.                 glVertex3f(0,0,Verts[z*verts_count*3+j*3+2]);
  107.                 glVertex3f(Verts[z*verts_count*3+(j+1)*3], Verts[z*verts_count*3+(j+1)*3+1], Verts[z*verts_count*3+(j+1)*3+2]);
  108.                 glEnd();
  109.             }
  110.             glBegin(GL_TRIANGLES);
  111.             glVertex3f(Verts[z*verts_count*3+(verts_count-1)*3], Verts[z*verts_count*3+(verts_count-1)*3+1], Verts[z*verts_count*3+(verts_count-1)*3+2]);
  112.             glVertex3f(0,0,Verts[z*verts_count*3+0*3+2]);
  113.             glVertex3f(Verts[z*verts_count*3+0*3], Verts[z*verts_count*3+0*3+1], Verts[z*verts_count*3+0*3+2]);
  114.             glEnd();
  115.         }
  116.         if (z==z_count) z--;
  117.         for (int i=0; i<verts_count;i++) {
  118.             glBegin(GL_TRIANGLES);
  119.  
  120.             glVertex3d (Verts[z*verts_count*3+i*3], Verts[z*verts_count*3+i*3+1], Verts[z*verts_count*3+i*3+2]);
  121.             glVertex3d (Verts[(z+1)*verts_count*3+i*3], Verts[(z+1)*verts_count*3+i*3+1], Verts[(z+1)*verts_count*3+i*3+2]);
  122.             if (i==verts_count-1) {
  123.                 glVertex3d (Verts[z*verts_count*3+0*3], Verts[z*verts_count*3+0*3+1], Verts[z*verts_count*3+0*3+2]);
  124.             }
  125.             else {
  126.                 glVertex3d (Verts[z*verts_count*3+(i+1)*3], Verts[z*verts_count*3+(i+1)*3+1], Verts[z*verts_count*3+(i+1)*3+2]);
  127.             }
  128.             glEnd();
  129.  
  130.             glBegin(GL_TRIANGLES);
  131.             if (i==0) {
  132.                 glVertex3d (Verts[(z+1)*verts_count*3+(verts_count-1)*3], Verts[(z+1)*verts_count*3+(verts_count-1)*3+1], Verts[(z+1)*verts_count*3+(verts_count-1)*3+2]);
  133.             }
  134.             else {
  135.                 glVertex3d (Verts[(z+1)*verts_count*3+(i-1)*3], Verts[(z+1)*verts_count*3+(i-1)*3+1], Verts[(z+1)*verts_count*3+(i-1)*3+2]);
  136.             }
  137.             glVertex3d (Verts[z*verts_count*3+i*3], Verts[z*verts_count*3+i*3+1], Verts[z*verts_count*3+i*3+2]);
  138.             glVertex3d (Verts[(z+1)*verts_count*3+i*3], Verts[(z+1)*verts_count*3+i*3+1], Verts[(z+1)*verts_count*3+i*3+2]);
  139.             glEnd();
  140.         }
  141.     }
  142. }
  143.  
  144. void draw4Polygon(GLfloat *v1, GLfloat *v2, GLfloat *v3, GLfloat *v4, GLfloat * col) {
  145.     if (isFill) {
  146.         glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  147.     }
  148.     else {
  149.         glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  150.     }
  151.     glBegin(GL_QUADS);
  152.     glColor3d(col[0], col[1], col[2]);
  153.     glVertex3d(v1[0], v1[1], v1[2]);
  154.     glVertex3d(v2[0], v2[1], v2[2]);
  155.     glVertex3d(v3[0], v3[1], v3[2]);
  156.     glVertex3d(v4[0], v4[1], v4[2]);
  157.     glEnd();
  158. }
  159.  
  160.  
  161. int main(void)
  162. {
  163.     glfwInit();
  164.     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
  165.     glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
  166.     glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
  167.  
  168.     GLFWwindow* window = glfwCreateWindow(900, 900, "OpenGL", NULL, NULL);
  169.     if (window == NULL) {
  170.         std::cout << "Failed to create GLFW window" << std::endl;
  171.         glfwTerminate();
  172.         return -1;
  173.     }
  174.     glfwMakeContextCurrent(window);
  175.     int screenWidth, screenHeight;
  176.     glfwGetFramebufferSize(window, &screenWidth, &screenHeight);
  177.  
  178.     if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
  179.         std::cout << "Failed to initialize GLAD" << std::endl;
  180.         return -1;
  181.     }
  182.  
  183.     glViewport(0.0f, 0.0f, screenWidth, screenHeight);
  184.  
  185.  
  186.     glfwSetKeyCallback(window, key_callback);
  187.     glEnable(GL_DEPTH_TEST);
  188.     glMatrixMode(GL_PROJECTION);
  189.     glOrtho(-5, 5, -5, 5, 0.5, 100);
  190.     glMatrixMode(GL_MODELVIEW);
  191.     giperboloidVerts();
  192.     while (!glfwWindowShouldClose(window))
  193.     {
  194.         right += incR;
  195.         up += incU;
  196.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  197.  
  198.         glLoadIdentity();
  199.  
  200.         glPushMatrix();
  201.         glTranslatef(0, 0, -10);
  202.         glRotatef(right, 0, 1, 0);
  203.         glRotatef(up, 1, 0, 0);
  204.  
  205.         if (v==1) {
  206.             giperboloidVerts();
  207.             v=0;
  208.         }
  209.         drawGiperboloid();
  210.         glPopMatrix();
  211.  
  212.         glPushMatrix();
  213.         glTranslatef(-4, -4, -6);
  214.         glScalef (0.5, 0.5, 0.5);
  215.         glRotatef (45, 1, 0, 0);
  216.         glRotatef (45, 0,1,0);
  217.  
  218.  
  219.         draw4Polygon(V1, V2, V4, V3, green);
  220.         draw4Polygon(V3, V4, V6, V5, blue);
  221.         draw4Polygon(V6, V5, V7, V8, red);
  222.         draw4Polygon(V2, V2, V7, V8, yellow);
  223.         draw4Polygon(V2, V4, V6, V8, white);
  224.         draw4Polygon(V1, V3, V5, V7, grey);
  225.  
  226.         glPopMatrix();
  227.         glfwSwapBuffers(window);
  228.         glfwPollEvents();
  229.     }
  230.  
  231.     glfwTerminate();
  232.     return 0;
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement