Keresés

Ú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;
    }

  • Lakers

    tag

    válasz Jester01 #642 üzenetére

    A main résznél van az u, v inicalizálva.
    u=getmaxx()/2; v=getmaxy()/2;, a másik két eltoltásos feladatom alapján néztem meg. Azok működnek, de itt valami bibit követhetek el.

  • Lakers

    tag

    válasz Jester01 #644 üzenetére

    És van valami ötleted, hogy hol kéne felhasználni az u,v vektoromat? Én akár hogy próbálkozom, semmit sem reagál rá...

  • Lakers

    tag

    válasz Jester01 #648 üzenetére

    Ennél jobb ötletem nem volt a tológatásra, na mindegy, majd mond rá valamit a gyakvezér.
    lnx=lny=0;
    lkx=getmaxx();
    lky=getmaxy();

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

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

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

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

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

    u+=dx; v+=dy;

  • Lakers

    tag

    Hello!

    Megoldandó probléma az lenne, hogy minden ponthoz húzni kéne egy egyenest... Valószínűleg a belső ciklusommal van a baj..., mert az csak annyit csinál, hogy az utolsó pontnál húz egy vonalat mindegyik pontba, kivéve az elsőhöz, arra szolgál az utolsó sor. Természetesen ha egyszer már egy átló megvan húzva, akkor nem kéne hogy az mégegyszer megismétlődjön, de arról lővésem sincs, hogyan kéne. :F :R

    [code]
    for (int i=0;i<N;i++)
    {
    lineto(int (pontok.x), int (pontok(i).y));
    for(int j=i+1; j<N; j++)
    {
    lineto(int (pontok[j].x), int (pontok[j].y));
    }
    }

    lineto(int (pontok[0].x), int (pontok[0].y));
    Ezzel a résszel akadtak problémáim

    [/code]

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