Guest User

Untitled

a guest
Apr 26th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.58 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <gl\glut.h>
  5. #include <gl\gl.h>
  6. #include <math.h>
  7. #include <time.h>
  8. #include <windows.h>
  9.  
  10. const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
  11. const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
  12. const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
  13. const GLfloat light_position[] = { -5.0f, 0.0f, 0.0f, 0.0f };
  14.  
  15. const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
  16. const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
  17. const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
  18. const GLfloat high_shininess[] = { 100.0f };
  19.  
  20. DWORD ostKolizja;
  21.  
  22. struct czasteczka {
  23.        float x;
  24.        float y;
  25.        float z;
  26.        float dx;
  27.        float dy;
  28.        float dz;
  29.        float r;
  30.        float rot;
  31.        float drot;
  32.        float kolorR;
  33.        float kolorG;
  34.        float kolorB;
  35. };
  36. #define ANIM_FPS  40
  37. #define N 50
  38. #define w_left -12.0
  39. #define w_right 12.0
  40. #define w_top 12.0
  41. #define w_bottom -12.0
  42. #define w_far -12.0
  43. #define w_near 12.0
  44. #define PIOVER180 0.01745329252
  45.  
  46. struct czasteczka c[N];
  47. GLdouble obsX=0.0, obsY=0.0, obsZ=-30.0;
  48. GLdouble katX = 0.0, katY = 0.0;
  49. GLdouble odleglosc = 30.0;
  50.  
  51. void kamera(GLdouble x, GLdouble y) {
  52.      katX += x*M_PI/2.0;
  53.      katY += y*M_PI/2.0;
  54.      obsX = -(float)sin(katY*PIOVER180)*odleglosc;
  55.      obsY = -(float)sin(katX*PIOVER180)*odleglosc;
  56.      obsZ = (float)cos(katY*PIOVER180)*odleglosc;
  57.  
  58. }
  59.  
  60.  
  61. void wypelnijTab(struct czasteczka c[]) {
  62.     int i;
  63.     for(i=0; i<N; i++) {
  64.       c[i].x    = ((float)(rand()%200)/10.0)-10.0;
  65.       c[i].y    = ((float)(rand()%200)/10.0)-10.0;
  66.       c[i].z    = ((float)(rand()%200)/10.0)-10.0;
  67.       c[i].dx   = ((float)(rand()%20)/50.0)-0.2;
  68.       c[i].dy   = ((float)(rand()%20)/50.0)-0.2;
  69.       c[i].dz   = ((float)(rand()%20)/50.0)-0.2;
  70.       c[i].r = ((float)(rand()%2)/10.0)+0.5;
  71.       c[i].rot = 0.0;
  72.       c[i].drot = (float)(rand()%20)-10.0;
  73.       c[i].kolorR = (rand()%100)/100.0;
  74.       c[i].kolorG = (rand()%100)/100.0;
  75.       c[i].kolorB = (rand()%100)/100.0;
  76.     }
  77. }
  78.  
  79. float iloczynSkalarny(float *v1, float *v2) {
  80.     return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
  81. }
  82.  
  83. void liczNoweWsp(struct czasteczka c[]) {
  84.      int i;
  85.      int k2;
  86.      int kolizja = 0;
  87.      for(i=0; i<N; i++) {
  88.        if(GetTickCount() - ostKolizja > 100) {
  89.          for(k2=0; k2<N; k2++) {
  90.            if(i==k2) continue;
  91.            float xr = (c[k2].x-c[i].x);
  92.            float yr = (c[k2].y-c[i].y);
  93.            float zr = (c[k2].z-c[i].z);
  94.            if(sqrt(xr*xr+yr*yr+zr*zr)<=(c[k2].r+c[i].r)) {
  95.              kolizja = 1;
  96.              FILE *plik = fopen("dane.txt", "a");
  97.              fprintf(plik, "Kolizja(%i:%i)! [%.4f] ",i,k2,sqrt(xr*xr+yr*yr+zr*zr));
  98.              fprintf(plik, "(%.3f,%.3f,%.3f) = (%.3f,%.3f,%.3f)\n", c[i].x,c[i].y,c[i].z,c[k2].x,c[k2].y,c[k2].z);
  99.              struct czasteczka norm = {c[i].x-c[k2].x,
  100.                                                c[i].y-c[k2].y,
  101.                                                c[i].z-c[k2].z};
  102.              float d = sqrt(norm.x*norm.x + norm.y*norm.y + norm.z*norm.z);
  103.              norm.x /= d;
  104.              norm.y /= d;
  105.              norm.z /= d;
  106.              //fprintf(plik, "Norm: %.3f:%.3f:%.3f ", norm.x, norm.y, norm.z);
  107.              float ilSk1 = c[i].dx*norm.x + c[i].dy*norm.y + c[i].dz*norm.z;
  108.              float ilSk2 = c[k2].dx*norm.x + c[k2].dy*norm.y + c[k2].dz*norm.z;
  109.              //fprintf(plik, "IlSk: %.4f ", ilSk1);
  110.              c[i].dx -= 2 * norm.x * ilSk1;
  111.              c[i].dy -= 2 * norm.y * ilSk1;
  112.              c[i].dz -= 2 * norm.z * ilSk1;
  113.              c[k2].dx -= 2 * norm.x * ilSk2;
  114.              c[k2].dy -= 2 * norm.y * ilSk2;
  115.              c[k2].dz -= 2 * norm.z * ilSk2;
  116.  
  117.              c[i].x+=c[i].dx;
  118.              c[i].y+=c[i].dy;
  119.              c[i].z+=c[i].dz;
  120.  
  121.              c[k2].x+=c[k2].dx;
  122.              c[k2].y+=c[k2].dy;
  123.              c[k2].z+=c[k2].dz;
  124.              //fprintf(plik, "Nowe: (%.3f:%.3f:%.3f) i (%.3f:%.3f:%.3f)\n", c[i].dx, c[i].dy, c[i].dz, c[k2].dx, c[k2].dy, c[k2].dz);
  125.  
  126.              fclose(plik);
  127.            }
  128.          }
  129.        }
  130.        if(c[i].x+c[i].r >= w_right && c[i].dx > 0.0) c[i].dx *= -1.0;
  131.        else if(c[i].x-c[i].r <= w_left && c[i].dx < 0.0) c[i].dx *= -1.0;
  132.        c[i].x += c[i].dx;
  133.  
  134.        if(c[i].y+c[i].r >= w_top && c[i].dy > 0.0) c[i].dy *= -1.0;
  135.        else if(c[i].y-c[i].r <= w_bottom && c[i].dy < 0.0) c[i].dy *= -1.0;
  136.        c[i].y += c[i].dy;
  137.  
  138.        if(c[i].z-c[i].r <= w_far && c[i].dz < 0.0) c[i].dz *= -1.0;
  139.        else if(c[i].z+c[i].r >= w_near && c[i].dz > 0.0) c[i].dz *= -1.0;
  140.        c[i].z += c[i].dz;
  141.  
  142.        c[i].rot += c[i].drot;
  143.      }
  144.      if(kolizja) ostKolizja = GetTickCount();
  145. }
  146. void wyswietlanie(void)
  147. {
  148.  
  149.     liczNoweWsp(c);
  150.     glClear(GL_COLOR_BUFFER_BIT);
  151.     glClear(GL_DEPTH_BUFFER_BIT);
  152.     int i;
  153.     for(i=0; i<N; i++) {
  154.        glLoadIdentity();
  155.        gluLookAt(obsX, obsY, obsZ,
  156.               0.0, 0.0, 0.0,
  157.               0.0, 1.0, 0.0);
  158.        glTranslatef(c[i].x, c[i].y, c[i].z);
  159.        glRotatef(0.0, c[i].rot, 0.0, 0.0);
  160.        glColor3f(c[i].kolorR, c[i].kolorG, c[i].kolorB);
  161.        glutSolidSphere(c[i].r*2, 30, 30);
  162.     }
  163.     glLoadIdentity();
  164.     gluLookAt(obsX, obsY, obsZ,
  165.               0.0, 0.0, 0.0,
  166.               0.0, 1.0, 0.0);
  167.     glColor3f(1.0, 1.0, 1.0);
  168.     glBegin(GL_LINES);
  169.       glVertex3f(w_left, w_top, w_near);
  170.       glVertex3f(w_left, w_top, w_far);
  171.  
  172.       glVertex3f(w_right, w_top, w_near);
  173.       glVertex3f(w_right, w_top, w_far);
  174.  
  175.       glVertex3f(w_left, w_top, w_near);
  176.       glVertex3f(w_right, w_top, w_near);
  177.  
  178.       glVertex3f(w_left, w_bottom, w_near);
  179.       glVertex3f(w_left, w_bottom, w_far);
  180.  
  181.       glVertex3f(w_right, w_bottom, w_near);
  182.       glVertex3f(w_right, w_bottom, w_far);
  183.  
  184.       glVertex3f(w_left, w_top, w_near);
  185.       glVertex3f(w_left, w_bottom, w_near);
  186.  
  187.       glVertex3f(w_right, w_top, w_near);
  188.       glVertex3f(w_right, w_bottom, w_near);
  189.  
  190.       glVertex3f(w_right, w_bottom, w_near);
  191.       glVertex3f(w_left, w_bottom, w_near);
  192.  
  193.       glVertex3f(w_left, w_top, w_far);
  194.       glVertex3f(w_right, w_top, w_far);
  195.  
  196.       glVertex3f(w_left, w_top, w_far);
  197.       glVertex3f(w_left, w_bottom, w_far);
  198.  
  199.       glVertex3f(w_right, w_top, w_far);
  200.       glVertex3f(w_right, w_bottom, w_far);
  201.  
  202.       glVertex3f(w_right, w_bottom, w_far);
  203.       glVertex3f(w_left, w_bottom, w_far);
  204.  
  205.     glEnd();
  206.     glFlush();
  207. }
  208.  
  209.  
  210. void skalowanie(int w, int h)
  211. {
  212.     glViewport(0,0,w,h);
  213.     glMatrixMode(GL_PROJECTION);
  214.     glLoadIdentity();
  215.     gluPerspective(90.0, w/(GLdouble)h, 0.1, 66.0);
  216.     //glOrtho(-15.0, 15.0, 15.0, -15.0, -15.0, 15.0);
  217.     //glFrustum(-15.0, 15.0, -15.0, 15.0, 1.1, 5.0);
  218.     glMatrixMode(GL_MODELVIEW);
  219.     glLoadIdentity();
  220. }
  221.  
  222. void klawiatura(unsigned char klawisz, int x, int y)
  223. {
  224.     glutPostRedisplay();
  225.     if(klawisz == 'a') kamera(0.0, 1.0);
  226.     if(klawisz == 'd') kamera(0.0, -1.0);
  227.     if(klawisz == 'w') kamera(-1.0, 0.0);
  228.     if(klawisz == 's') kamera(1.0, 0.0);
  229.     if(klawisz == '+') odleglosc++; kamera(0.0, 0.0);
  230.     if(klawisz == '-') odleglosc--; kamera(0.0, 0.0);
  231.  
  232.     skalowanie( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
  233. }
  234.  
  235. void ZegarFun(int val) {
  236.     /* Odrysowanie sceny: */
  237.     glutPostRedisplay();
  238.     /* Ponowne wystartowanie zegara: */
  239.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0);
  240. }
  241.  
  242.  
  243. int main(int argil, char *argtab[])
  244. {
  245.     srand(time(NULL));
  246.     wypelnijTab(c);
  247.     glutInit(&argil,argtab);
  248.     glutInitDisplayMode(GLUT_RGBA|GLUT_SINGLE);
  249.     glutInitWindowSize(800,600);
  250.     glutInitWindowPosition(50,50);
  251.     glutCreateWindow("Cząsteczki");
  252.  
  253.     glClearColor(0,0,0,0);
  254.     glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  255.     //swiatlo
  256.     glEnable(GL_CULL_FACE);
  257.     glCullFace(GL_BACK);
  258.     glShadeModel(GL_SMOOTH);
  259.     glEnable(GL_DEPTH_TEST);
  260.     glDepthFunc(GL_LESS);
  261.  
  262.     glEnable(GL_LIGHT0);
  263.     glEnable(GL_NORMALIZE);
  264.     glEnable(GL_COLOR_MATERIAL);
  265.     glEnable(GL_LIGHTING);
  266.  
  267.     glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
  268.     glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
  269.     glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
  270.     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  271.  
  272.     glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
  273.     glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
  274.     glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
  275.     glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
  276.     glutDisplayFunc(wyswietlanie);
  277.     glutReshapeFunc(skalowanie);
  278.     glutKeyboardFunc(klawiatura);
  279.  
  280.     glutTimerFunc(1000/ANIM_FPS, ZegarFun, 0); //predkosc animacji
  281.  
  282.  
  283.  
  284.     glutMainLoop();
  285.     return 0;
  286. }
Add Comment
Please, Sign In to add comment