Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <allegro.h>
- #include <time.h>
- #include <math.h>
- #define DARAB 750
- struct Csillag {
- double x, y, z;
- double vx, vy, vz;
- double m;
- int xk, yk;
- int c;
- int r;
- double ax, ay, az;
- };
- int main()
- {
- const double gamma=4;
- double delta_t=0.001;
- double szumma_m;
- double x,y,z;
- double tav;
- double dx, dy, dz;
- double xn, yn, zn;
- PALETTE p;
- double szog=0;
- int i, j;
- struct Csillag csillagok[DARAB];
- struct Csillag vonal[4];
- memset(csillagok, 0, sizeof(csillagok));
- memset(vonal, 0, sizeof(vonal));
- allegro_init();
- set_gfx_mode (GFX_AUTODETECT_WINDOWED, 600, 600, 0, 0);
- install_keyboard();
- install_mouse();
- enable_hardware_cursor();
- show_mouse(screen);
- srand(time(0));
- p[0].r=0;
- p[0].g=0;
- p[0].b=0;
- for (i=1;i<256;i++) {
- p[i].r=rand()%32+32;
- p[i].g=rand()%32+32;
- p[i].b=rand()%32+32;
- }
- set_palette(p);
- vonal[0].x=-1000;
- vonal[0].y=-1000;
- vonal[0].z= 1000;
- vonal[1].x= 1000;
- vonal[1].y=-1000;
- vonal[1].z= 1000;
- vonal[2].x= 1000;
- vonal[2].y= 1000;
- vonal[2].z= 1000;
- vonal[3].x=-1000;
- vonal[3].y= 1000;
- vonal[3].z= 1000;
- for (i=0;i<DARAB;i++) {
- double v;
- double r=rand()%900+10; /* EZ A TAVOLSAG A KOZEPPONTTOL */
- double szog=i/(double)DARAB*2.0*3.1415926535;
- csillagok[i].x=r*cos(szog);
- csillagok[i].y=rand()%100-50;
- csillagok[i].z=r*sin(szog);
- csillagok[i].m=rand()%30+10;
- v=sqrt(1000000*r/csillagok[i].m)+rand()%2000-1000;
- csillagok[i].vx=v*sin(szog) + rand()%20-10;
- csillagok[i].vy=rand()%100-50;
- csillagok[i].vz=-v*cos(szog) + rand()%20-10;
- csillagok[i].c=rand()%255+1;
- csillagok[i].r=(csillagok[i].m-10)/15;
- }
- /******************
- EZT A RESZT
- kikommenteled akkor csak egy galaxis van
- ***************/
- for (i=0;i<DARAB;i+=2) {
- double t;
- t=csillagok[i].x;
- csillagok[i].x=1500-csillagok[i].y;
- csillagok[i].y=-csillagok[i].z;
- csillagok[i].z=-t;
- t=csillagok[i].vx;
- csillagok[i].vx=-csillagok[i].vy;
- csillagok[i].vy=-csillagok[i].vz;
- csillagok[i].vz=-t;
- }
- /* összes tömeg kiszámítása */
- szumma_m=0;
- for (i=0;i<DARAB;i++)
- szumma_m+=csillagok[i].m;
- /* tömegközéppont kiszámítása */
- x=0; y=0; z=0;
- for (i=0;i<DARAB;i++) {
- x+=csillagok[i].x*csillagok[i].m;
- y+=csillagok[i].y*csillagok[i].m;
- z+=csillagok[i].z*csillagok[i].m;
- }
- x=x/szumma_m;
- y=y/szumma_m;
- z=z/szumma_m;
- /* tömegközéppont a képernyő közepére állítása */
- for (i=0;i<DARAB;i++) {
- csillagok[i].x-=x;
- csillagok[i].y-=y;
- csillagok[i].z-=z;
- }
- /* tömegközéppont sebességének kiszámítása */
- x=0; y=0; z=0;
- for (i=0;i<DARAB;i++) {
- x+=csillagok[i].vx*csillagok[i].m;
- y+=csillagok[i].vy*csillagok[i].m;
- z+=csillagok[i].vz*csillagok[i].m;
- }
- x=x/szumma_m;
- y=y/szumma_m;
- z=z/szumma_m;
- /* tömegközéppont sebességének nullázása */
- for (i=0;i<DARAB;i++) {
- csillagok[i].vx-=x;
- csillagok[i].vy-=y;
- csillagok[i].vz-=z;
- }
- /* innen indul a fő ciklus */
- while (!keypressed() && mouse_b==0) {
- /* szimuláció */
- for (i=0; i<DARAB; i++)
- csillagok[i].ax=csillagok[i].ay=csillagok[i].az=0;
- for (i=0; i<DARAB; i++) {
- for (j=i+1; j<DARAB; j++) {
- dx=csillagok[i].x-csillagok[j].x;
- dy=csillagok[i].y-csillagok[j].y;
- dz=csillagok[i].z-csillagok[j].z;
- tav=sqrt(dx*dx+dy*dy+dz*dz);
- csillagok[i].ax-=gamma*csillagok[j].m*(dx)/tav;
- csillagok[i].ay-=gamma*csillagok[j].m*(dy)/tav;
- csillagok[i].az-=gamma*csillagok[j].m*(dz)/tav;
- csillagok[j].ax+=gamma*csillagok[i].m*(dx)/tav;
- csillagok[j].ay+=gamma*csillagok[i].m*(dy)/tav;
- csillagok[j].az+=gamma*csillagok[i].m*(dz)/tav;
- }
- }
- szog=(SCREEN_W/2-mouse_x)/(double)SCREEN_W*3.14159265;
- for (i=0; i<DARAB; i++) {
- circlefill(screen, csillagok[i].xk, csillagok[i].yk, csillagok[i].r, 0);
- /* mozgatás */
- csillagok[i].x+=csillagok[i].vx*delta_t;
- csillagok[i].y+=csillagok[i].vy*delta_t;
- csillagok[i].z+=csillagok[i].vz*delta_t;
- csillagok[i].vx+=csillagok[i].ax*delta_t;
- csillagok[i].vy+=csillagok[i].ay*delta_t;
- csillagok[i].vz+=csillagok[i].az*delta_t;
- /* forgatás és perspektíva */
- xn=csillagok[i].x*cos(szog)-csillagok[i].y*sin(szog);
- yn=csillagok[i].x*sin(szog)+csillagok[i].y*cos(szog);
- zn=csillagok[i].z;
- csillagok[i].xk=SCREEN_W/2+xn*800/(5000-yn);
- csillagok[i].yk=SCREEN_H/2+zn*800/(5000-yn);
- circlefill(screen, csillagok[i].xk, csillagok[i].yk, csillagok[i].r, csillagok[i].c);
- }
- for (i=0;i<4;i++)
- line(screen,vonal[i].xk,vonal[i].yk,vonal[(i+1)%4].xk,vonal[(i+1)%4].yk,0);
- for (i=0;i<4;i++) {
- xn=vonal[i].x*cos(szog)-vonal[i].y*sin(szog);
- yn=vonal[i].x*sin(szog)+vonal[i].y*cos(szog);
- zn=vonal[i].z;
- vonal[i].xk=SCREEN_W/2+xn*800/(5000-yn);
- vonal[i].yk=SCREEN_H/2+zn*800/(5000-yn);
- }
- for (i=0;i<4;i++)
- line(screen,vonal[i].xk,vonal[i].yk,vonal[(i+1)%4].xk,vonal[(i+1)%4].yk,15);
- }
- allegro_exit();
- return 0;
- }
- END_OF_MAIN()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement