Hirdetés

Aktív témák

  • t3rm1nat0r

    csendes tag

    A vallás topikban felmerült a kockadobás téma, ide teszem a szimulációját.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <X11/Xlib.h>
    #include <assert.h>
    #include <unistd.h>


    Display *disp;
    Window win;
    GC gc;



    void draw_line(int x1,int y1,int x2,int y2,int szin)
    {
    XSetForeground(disp,gc,szin);
    XDrawLine(disp, win, gc, x1,y1,x2,y2);
    }
    void setup()
    {
    disp = XOpenDisplay((0));
    win = XCreateSimpleWindow(disp, DefaultRootWindow(disp), 0,0, 1200, 850, 0,0,0);

    XSelectInput(disp, win, StructureNotifyMask);
    XMapWindow(disp, win);

    gc = XCreateGC(disp, win, 0, (0));
    XSetForeground(disp,gc,0);

    while(1)
    {
    XEvent event;
    XNextEvent(disp, &event);
    if (event.type == MapNotify)break;
    }
    }





    void vektor(float *v1,float x,float y,float z)
    {
    v1[0] = x;
    v1[1] = y;
    v1[2] = z;
    };
    void cross(float *v1,float *v2,float *v3)
    {
    int k;
    float v4[3];

    v4[0] = (v2[1]*v3[2]) - (v3[1]*v2[2]);
    v4[1] = (v2[2]*v3[0]) - (v3[2]*v2[0]);
    v4[2] = (v2[0]*v3[1]) - (v3[0]*v2[1]);

    for(k=0;k<3;k++) v1[k]=v4[k];
    };
    float dot(float *v1,float *v2)
    {
    int k;
    float t = 0;
    for(k=0;k<3;k++) t += v1[k]*v2[k];
    return t;
    }
    void normalize(float *v2,float *v1)
    {
    int k;
    float t = sqrt(dot(v1,v1));
    for(k=0;k<3;k++) v2[k] = v1[k]/t;
    }

    void mul(float *v3,float *v1,float *v2)
    {
    int k,j;
    for(k=0;k<3;k++) v3[k]=0;

    for(j=0;j<3;j++)
    for(k=0;k<3;k++) v3[j] += v1[j*3+k]*v2[k];
    }
    void muls(float *v2,float *v1,float s2)
    {
    int k;
    for(k=0;k<3;k++) v2[k] = v1[k]*s2;
    }
    void divs(float *v3,float *v1,float v2)
    {
    int k;
    for(k=0;k<3;k++) v3[k] = v1[k]/v2;
    }
    void add(float *v3,float *v1,float *v2)
    {
    int k;
    for(k=0;k<3;k++) v3[k] = v1[k]+v2[k];
    }
    void sub(float *v3,float *v1,float *v2)
    {
    int k;
    for(k=0;k<3;k++) v3[k] = v1[k]-v2[k];
    }
    void copy(float *v1,float *v2)
    {
    int k;
    for(k=0;k<3;k++) v1[k] = v2[k];
    }







    float kamera_matrix[9];
    float fel[3],szem[3],origo[3];
    int x2d[4],y2d[4],z2d[4];
    float p[3],v[3],I[3],kocka_matrix[9],gravitacio[3],m=20.0/1000.0;


    void transform3d(float *v1,int n)
    {
    float v3[3],v4[3];

    sub(v4,v1,szem);
    mul(v3,kamera_matrix,v4);

    x2d[n]=500+(int)(v3[0]*500.0/v3[2]);
    y2d[n]=400-(int)(v3[1]*500.0/v3[2]);
    z2d[n]=(int)v3[2];
    }
    void drawline3d(float *v1,float *v2,int szin)
    {
    transform3d(v1,0);
    transform3d(v2,1);

    if(z2d[0]>20)
    if(z2d[1]>20)
    draw_line(x2d[0],y2d[0],x2d[1],y2d[1],szin);
    }

    void kocka()
    {
    float r=19.0/2.0;
    int k,j,x,y;

    vektor(szem,300,250,200);
    vektor(origo,0,0,0);
    vektor(fel,0,1,0);



    vektor(p,0,500,-300);
    vektor(v,0,1110,510);
    vektor(I,12.0 ,1.0,7.0);
    //I[0] += I[0]/5000.0;
    //I[0] -= I[0]/5000.0;

    vektor(&kocka_matrix[0],1,0,0);
    vektor(&kocka_matrix[3],0,1,0);
    vektor(&kocka_matrix[6],0,0,1);
    vektor(gravitacio,0.0,-9810.0,0.0);
    float dt=0.001;
    int szin=0;

    while(1)
    {
    float u[3];

    copy(origo,p);
    vektor(u,100,50,30);
    add(szem,origo , u);

    sub(&kamera_matrix[6],origo,szem);
    normalize(&kamera_matrix[6],&kamera_matrix[6]);
    cross(&kamera_matrix[0],&kamera_matrix[6],fel);
    cross(&kamera_matrix[3],&kamera_matrix[0],&kamera_matrix[6]);




    muls(u,v,dt); add(p,p , u);
    muls(u,gravitacio,dt); add(v,v , u);

    float dt2=dt/100.0;
    for(k=0;k<100;k++)
    {
    float v_[3];

    for(j=0;j<9;j+=3)
    {
    cross(v_,&kocka_matrix[j],I);
    muls(u,v_,dt2);
    add(&kocka_matrix[j],&kocka_matrix[j] , u);

    normalize(&kocka_matrix[j],&kocka_matrix[j]);
    }
    }


    float sarkok[8][3],elojel[8][3]={{1.0,1.0,-1.0},{1.0,-1.0,-1.0},{-1.0,-1.0,-1.0},{-1.0,1.0,-1.0},{1.0,1.0,1.0},{1.0,-1.0,1.0},{-1.0,-1.0,1.0},{-1.0,1.0,1.0}};
    for(j=0;j<8;j++)
    {
    muls(u,&kocka_matrix[0],r*elojel[j][0]); add(sarkok[j],p , u);
    muls(u,&kocka_matrix[3],r*elojel[j][1]); add(sarkok[j],sarkok[j], u);
    muls(u,&kocka_matrix[6],r*elojel[j][2]); add(sarkok[j],sarkok[j], u);
    }


    for(j=0;j<8;j++)
    if(sarkok[j][1]<0.0)
    {
    float R[3],Rn[3],Ri[3],v_[3],v_n[3],normal[3];
    vektor(normal,0,1,0);

    sub(R,sarkok[j],p);
    normalize(Rn,R);
    vektor(Ri,-Rn[0],-Rn[1],-Rn[2]);

    cross(u,Rn,I);
    muls(u,u,r);
    add(v_,u , v);
    vektor(v_,-v_[0],-v_[1],-v_[2]);

    float z=dot(v_,normal);
    muls(v_n,normal,z);
    sub(v_,v_,v_n);



    z=dot(Ri,v_n);

    if(z>0.0) {muls(u,Ri,z*1.4);add(v,v , u);}
    if(v_n[1]>0.0) {divs(u,v_n,r);cross(u,u,Rn);muls(u,u,1.4);add(I,I ,u );}

    muls(u,v_,0.4);add(v,v , u);
    divs(u,v_,r);cross(u,u ,Rn);muls(u,u,0.4);add(I,I , u);
    }




    szin=0xffff00;

    XClearWindow(disp,win);
    for(y=-2000;y<2000;y+=100)
    for(x=-2000;x<2000;x+=100)
    {
    float u1[3],u2[3],u3[3];

    vektor(u1,x,0,y);
    vektor(u2,x,0,y+100);
    vektor(u3,x+100,0,y);

    drawline3d(u1,u2,0xff0000);
    drawline3d(u1,u3,0xff0000);
    }

    drawline3d(sarkok[0],sarkok[2],0xff0000);
    drawline3d(sarkok[1],sarkok[3],0xff0000);

    drawline3d(sarkok[0],sarkok[4],0xff00ff);
    drawline3d(sarkok[1],sarkok[5],0x0000ff);
    drawline3d(sarkok[2],sarkok[6],0x00ff00);
    drawline3d(sarkok[3],sarkok[7],0xff0000);

    drawline3d(sarkok[0],sarkok[1],szin);
    drawline3d(sarkok[1],sarkok[2],szin);
    drawline3d(sarkok[2],sarkok[3],szin);
    drawline3d(sarkok[3],sarkok[0],szin);
    drawline3d(sarkok[4],sarkok[5],szin);
    drawline3d(sarkok[5],sarkok[6],szin);
    drawline3d(sarkok[6],sarkok[7],szin);
    drawline3d(sarkok[7],sarkok[4],szin);


    for(j=0;j<8;j++) sarkok[j][1]=0;
    szin=0xff0000;
    drawline3d(sarkok[0],sarkok[4],szin);
    drawline3d(sarkok[1],sarkok[5],szin);
    drawline3d(sarkok[2],sarkok[6],szin);
    drawline3d(sarkok[3],sarkok[7],szin);

    drawline3d(sarkok[0],sarkok[1],szin);
    drawline3d(sarkok[1],sarkok[2],szin);
    drawline3d(sarkok[2],sarkok[3],szin);
    drawline3d(sarkok[3],sarkok[0],szin);
    drawline3d(sarkok[4],sarkok[5],szin);
    drawline3d(sarkok[5],sarkok[6],szin);
    drawline3d(sarkok[6],sarkok[7],szin);
    drawline3d(sarkok[7],sarkok[4],szin);


    usleep(1000);
    XFlush(disp);
    }
    }

    int main()
    {
    setup();

    kocka();
    XFlush(disp);
    getchar();

    return 0;

    }

Aktív témák