Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2017
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
BNF 5.80 KB | None | 0 0
  1. #include <allegro.h>
  2. #include <time.h>
  3. #include <math.h>
  4.  
  5. #define DARAB 750
  6.  
  7. struct Csillag {
  8.     double x, y, z;
  9.     double vx, vy, vz;
  10.     double m;
  11.     int xk, yk;
  12.     int c;
  13.     int r;
  14.     double ax, ay, az;
  15. };
  16.  
  17. int main()
  18. {
  19.     const double gamma=4;
  20.  
  21.     double delta_t=0.001;
  22.  
  23.     double szumma_m;
  24.     double x,y,z;
  25.     double tav;
  26.     double dx, dy, dz;
  27.     double xn, yn, zn;
  28.     PALETTE p;
  29.     double szog=0;
  30.  
  31.     int i, j;
  32.  
  33.     struct Csillag csillagok[DARAB];
  34.     struct Csillag vonal[4];
  35.  
  36.     memset(csillagok, 0, sizeof(csillagok));
  37.     memset(vonal, 0, sizeof(vonal));
  38.  
  39.     allegro_init();
  40.     set_gfx_mode (GFX_AUTODETECT_WINDOWED, 600, 600, 0, 0);
  41.     install_keyboard();
  42.     install_mouse();
  43.     enable_hardware_cursor();
  44.     show_mouse(screen);
  45.  
  46.     srand(time(0));
  47.  
  48.     p[0].r=0;
  49.     p[0].g=0;
  50.     p[0].b=0;
  51.  
  52.     for (i=1;i<256;i++) {
  53.         p[i].r=rand()%32+32;
  54.         p[i].g=rand()%32+32;
  55.         p[i].b=rand()%32+32;
  56.     }
  57.     set_palette(p);
  58.  
  59.     vonal[0].x=-1000;
  60.     vonal[0].y=-1000;
  61.     vonal[0].z= 1000;
  62.     vonal[1].x= 1000;
  63.     vonal[1].y=-1000;
  64.     vonal[1].z= 1000;
  65.     vonal[2].x= 1000;
  66.     vonal[2].y= 1000;
  67.     vonal[2].z= 1000;
  68.     vonal[3].x=-1000;
  69.     vonal[3].y= 1000;
  70.     vonal[3].z= 1000;
  71.  
  72.     for (i=0;i<DARAB;i++) {
  73.         double v;
  74.         double r=rand()%900+10; /* EZ A TAVOLSAG A KOZEPPONTTOL */
  75.         double szog=i/(double)DARAB*2.0*3.1415926535;
  76.         csillagok[i].x=r*cos(szog);
  77.         csillagok[i].y=rand()%100-50;
  78.         csillagok[i].z=r*sin(szog);
  79.  
  80.         csillagok[i].m=rand()%30+10;
  81.         v=sqrt(1000000*r/csillagok[i].m)+rand()%2000-1000;
  82.         csillagok[i].vx=v*sin(szog) + rand()%20-10;
  83.         csillagok[i].vy=rand()%100-50;
  84.         csillagok[i].vz=-v*cos(szog) + rand()%20-10;
  85.         csillagok[i].c=rand()%255+1;
  86.         csillagok[i].r=(csillagok[i].m-10)/15;
  87.     }
  88.  
  89.     /******************
  90.     EZT A RESZT
  91.     kikommenteled akkor csak egy galaxis van
  92.     ***************/
  93.     for (i=0;i<DARAB;i+=2) {
  94.         double t;
  95.         t=csillagok[i].x;
  96.         csillagok[i].x=1500-csillagok[i].y;
  97.         csillagok[i].y=-csillagok[i].z;
  98.         csillagok[i].z=-t;
  99.         t=csillagok[i].vx;
  100.         csillagok[i].vx=-csillagok[i].vy;
  101.         csillagok[i].vy=-csillagok[i].vz;
  102.         csillagok[i].vz=-t;
  103.     }
  104.  
  105.     /* összes tömeg kiszámítása */
  106.     szumma_m=0;
  107.     for (i=0;i<DARAB;i++)
  108.         szumma_m+=csillagok[i].m;
  109.     /* tömegközéppont kiszámítása */
  110.     x=0; y=0; z=0;
  111.     for (i=0;i<DARAB;i++) {
  112.         x+=csillagok[i].x*csillagok[i].m;
  113.         y+=csillagok[i].y*csillagok[i].m;
  114.         z+=csillagok[i].z*csillagok[i].m;
  115.     }
  116.     x=x/szumma_m;
  117.     y=y/szumma_m;
  118.     z=z/szumma_m;
  119.     /* tömegközéppont a képernyő közepére állítása */
  120.     for (i=0;i<DARAB;i++) {
  121.         csillagok[i].x-=x;
  122.         csillagok[i].y-=y;
  123.         csillagok[i].z-=z;
  124.     }
  125.  
  126.     /* tömegközéppont sebességének kiszámítása */
  127.     x=0; y=0; z=0;
  128.     for (i=0;i<DARAB;i++) {
  129.         x+=csillagok[i].vx*csillagok[i].m;
  130.         y+=csillagok[i].vy*csillagok[i].m;
  131.         z+=csillagok[i].vz*csillagok[i].m;
  132.     }
  133.     x=x/szumma_m;
  134.     y=y/szumma_m;
  135.     z=z/szumma_m;
  136.     /* tömegközéppont sebességének nullázása */
  137.     for (i=0;i<DARAB;i++) {
  138.         csillagok[i].vx-=x;
  139.         csillagok[i].vy-=y;
  140.         csillagok[i].vz-=z;
  141.     }
  142.  
  143.     /* innen indul a fő ciklus */
  144.     while (!keypressed() && mouse_b==0) {
  145.         /* szimuláció */
  146.         for (i=0; i<DARAB; i++)
  147.             csillagok[i].ax=csillagok[i].ay=csillagok[i].az=0;
  148.  
  149.         for (i=0; i<DARAB; i++) {
  150.             for (j=i+1; j<DARAB; j++) {
  151.                 dx=csillagok[i].x-csillagok[j].x;
  152.                 dy=csillagok[i].y-csillagok[j].y;
  153.                 dz=csillagok[i].z-csillagok[j].z;
  154.                 tav=sqrt(dx*dx+dy*dy+dz*dz);
  155.                 csillagok[i].ax-=gamma*csillagok[j].m*(dx)/tav;
  156.                 csillagok[i].ay-=gamma*csillagok[j].m*(dy)/tav;
  157.                 csillagok[i].az-=gamma*csillagok[j].m*(dz)/tav;
  158.                 csillagok[j].ax+=gamma*csillagok[i].m*(dx)/tav;
  159.                 csillagok[j].ay+=gamma*csillagok[i].m*(dy)/tav;
  160.                 csillagok[j].az+=gamma*csillagok[i].m*(dz)/tav;
  161.             }
  162.         }
  163.  
  164.         szog=(SCREEN_W/2-mouse_x)/(double)SCREEN_W*3.14159265;
  165.         for (i=0; i<DARAB; i++) {
  166.             circlefill(screen, csillagok[i].xk, csillagok[i].yk, csillagok[i].r, 0);
  167.  
  168.             /* mozgatás */
  169.             csillagok[i].x+=csillagok[i].vx*delta_t;
  170.             csillagok[i].y+=csillagok[i].vy*delta_t;
  171.             csillagok[i].z+=csillagok[i].vz*delta_t;
  172.  
  173.             csillagok[i].vx+=csillagok[i].ax*delta_t;
  174.             csillagok[i].vy+=csillagok[i].ay*delta_t;
  175.             csillagok[i].vz+=csillagok[i].az*delta_t;
  176.  
  177.             /* forgatás és perspektíva */
  178.             xn=csillagok[i].x*cos(szog)-csillagok[i].y*sin(szog);
  179.             yn=csillagok[i].x*sin(szog)+csillagok[i].y*cos(szog);
  180.             zn=csillagok[i].z;
  181.             csillagok[i].xk=SCREEN_W/2+xn*800/(5000-yn);
  182.             csillagok[i].yk=SCREEN_H/2+zn*800/(5000-yn);
  183.  
  184.             circlefill(screen, csillagok[i].xk, csillagok[i].yk, csillagok[i].r, csillagok[i].c);
  185.         }
  186.         for (i=0;i<4;i++)
  187.             line(screen,vonal[i].xk,vonal[i].yk,vonal[(i+1)%4].xk,vonal[(i+1)%4].yk,0);
  188.         for (i=0;i<4;i++) {
  189.             xn=vonal[i].x*cos(szog)-vonal[i].y*sin(szog);
  190.             yn=vonal[i].x*sin(szog)+vonal[i].y*cos(szog);
  191.             zn=vonal[i].z;
  192.             vonal[i].xk=SCREEN_W/2+xn*800/(5000-yn);
  193.             vonal[i].yk=SCREEN_H/2+zn*800/(5000-yn);
  194.         }
  195.         for (i=0;i<4;i++)
  196.             line(screen,vonal[i].xk,vonal[i].yk,vonal[(i+1)%4].xk,vonal[(i+1)%4].yk,15);
  197.  
  198.     }
  199.  
  200.     allegro_exit();
  201.     return 0;
  202. }
  203. END_OF_MAIN()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement