Új hozzászólás Aktív témák

  • Lakers

    tag

    Sziasztok!

    Van egy kockám, ami x, y, és z tengely körül forog. Ez egy view_to_windows transzformációban van megvalósítva. Viszont az is kéne, hogy teljesn képernyőn pattogjon.
    Sajnos a pattogást megpróbáltam a csúcsok segítségével de nem jött össze, semmit sem csinál. Mi lehet a baj? Van valakinek rá ötlete? :R

    # include "graphics.h"
    # include <conio.h>
    # include <stdio.h>

    #define N 7

    struct lap
    {
    int A,B,C,D,SZIN;
    };

    typedef struct el
    {
    int A,B;
    } EL;

    struct box
    {
    pont2d MIN,MAX;
    };

    pont2d vvtrf(box W, box V,pont2d P)
    {
    pont2d Q;
    Q.x=(P.x-W.MIN.x)*(V.MAX.x-V.MIN.x)/(W.MAX.x-W.MIN.x)+V.MIN.x;
    Q.y=(P.y-W.MIN.y)*(V.MAX.y-V.MIN.y)/(W.MAX.y-W.MIN.y)+V.MIN.y;
    return Q;
    };

    pont3d forgat(float a,float b,float c,pont3d P)
    {
    pont3d Q;
    pont3d tmp;
    //x tengelyre
    Q.x=1*P.x;
    Q.y=cos(a)*P.y+(-sin(a)*P.z);
    Q.z=sin(a)*P.y+cos(a)*P.z;
    tmp.x=Q.x;
    tmp.y=Q.y;
    tmp.z=Q.z;
    //y tengelyre
    Q.x=cos(b)*tmp.x+sin(b)*tmp.z;
    Q.y=1*tmp.y;
    Q.z=(-sin(b)*tmp.x)+cos(b)*tmp.z;
    tmp.x=Q.x;
    tmp.y=Q.y;
    tmp.z=Q.z;
    //z tengelyre
    Q.x=cos(c)*tmp.x+(-sin(b)*tmp.y);
    Q.y=sin(c)*tmp.x+cos(a)*tmp.y;
    Q.z=1*tmp.y;
    return Q;
    };

    pont2d centproj(int s,pont3d Q)
    {
    pont2d P;
    P.x=Q.x*(s/(s-Q.z));
    P.y=Q.y*(s/(s-Q.z));
    return P;
    };

    pont3d metszilleszt (pont3d A, pont3d B)
    {
    pont3d C;
    C.x = A.y * B.z - A.z * B.y;
    C.y = - A.x * B.z + A.z * B.x;
    C.z = A.x * B.y - A.y * B.x;
    return C;
    };

    int main(void)
    {
    int u, v, lnx, lny, lkx, lky, dx=1, dy=1;
    int gd,gm,page=0,i;
    gd = VGA;
    gm = VGAMED;
    initgraph(&gd,&gm,"");

    u=getmaxx()/2;
    v=getmaxy()/2;

    pont2d l[8],t[8];
    pont3d f[8];
    pont3d p[8]={{1,-1,1},
    {1,-1,-1},
    {-1,-1,-1},
    {-1,-1,1},
    {1,1,1},
    {1,1,-1},
    {-1,1,-1},
    {-1,1,1}};
    el elek[12]={{0,1},{1,2},{2,3},{3,0},{4,5},{5,6},{6,7},{7,4},{0,4},{1,5},{2,6},{3,7}};
    lap lapok[6] = {{0,1,5,4,1},
    {1,2,6,5,2},
    {2,3,7,6,3},
    {3,0,4,7,4},
    {4,5,6,7,5},
    {1,0,3,2,6}};
    pont3d a1,n,AB,BC;;
    float a=1*M_PI/180;
    float b=1*M_PI/180;
    float c=1*M_PI/180;
    box V,W;
    V.MIN.x=10; W.MIN.x=-3;
    V.MIN.y=300; W.MIN.y=-3;
    V.MAX.x=310; W.MAX.x=3;
    V.MAX.y=10; W.MAX.y=3;

    for (;;)
    {
    setactivepage(page);
    cleardevice();

    a+=1*M_PI/180;
    b=c=a;

    delay(10);
    for (i=0; i<8; ++i)
    {
    f[i]=forgat(a,b,c,p[i]);
    l[i]=centproj(200,f[i]);
    t[i]=vvtrf(W,V,l[i]);
    }


    for (i=0; i<6; ++i)
    {
    pont2d A,B,C,D;
    A=t[lapok[i].A];
    B=t[lapok[i].B];
    C=t[lapok[i].C];
    D=t[lapok[i].D];

    AB.x=B.x-A.x;
    AB.y=B.y-A.y;
    BC.x=C.x-B.x;
    BC.y=C.y-B.y;

    int poly[8] = {(int)A.x,(int)A.y, (int)B.x,(int)B.y, (int)C.x,(int)C.y, (int)D.x,(int)D.y};
    //setfillstyle(INTERLEAVE_FILL,lapok[i].SZIN);
    //setfillstyle(SOLID_FILL,lapok[i].SZIN);

    n=metszilleszt(AB,BC); //AB × BC
    a1=(pont3d)f[lapok[i].A];

    if (n.x*(-1*a1.x)+n.y*(-1*a1.y)+n.z*(200-(-1*a1.z))>0)
    { setcolor(lapok[i].SZIN);
    fillpoly(4,poly);
    //setcolor(WHITE);
    }



    }
    //pattogtatás
    lnx=lny=0;
    lkx=getmaxx();
    lky=getmaxy();

    for (i=0; i<N; ++i)
    {
    if (p[i].x>lnx)
    lnx=(int)p[i].x;

    if (p[i].x<lkx)
    lkx=(int)p[i].x;

    if (p[i].x>lny)
    lny=(int)p[i].x;

    if (p[i].x<lky)
    lky=(int)p[i].x;
    }

    if (lnx>=getmaxx()-1 || lkx<=1)
    dx=-dx;
    if (lny>=getmaxy()-1 || lky<=1)
    dy=-dy;

    u+=dx; v+=dy;

    setvisualpage(page);
    page = 1-page;
    if (kbhit())
    break;
    }
    closegraph();
    return 0;
    }

Új hozzászólás Aktív témák