/* 2. felev, uj tematika, C nyelv grafika 2., 7.gyak, MENEDZSER transzformaciok sikban */ //Grafikus transzformacio demo program //Kezeles a numerikus tasztaturaval, NumLock legyen bekapcsolva!!! #include #include #include #include int gd,gm; double Lx,Ly,x1Gl,y1Gl,x2Gl,y2Gl; //fuggveny prototipusok: void GrStart(double x1,double y1,double x2,double y2); int XK(double x); int YK(double y); void Elt(double x0, double y0, double dx, double dy, double* x1, double* y1); void Forg(double x0, double y0, double alfa, double* x1, double* y1); void Zoom(double x0, double y0, double kx, double ky, double* x1, double* y1); void main() { double P1x,P1y,P2x,P2y,P3x,P3y; //haromszogcsucsok a Vilag KR-ben double dx,dy,kx,ky, alfa, dalfa; //dalfa a szoglepes forgatashoz char bill; clrscr(); puts("Transzformacio-demo\n"); puts("Add meg a Vilag-koordinatatartomany hatarait!"); puts("Celszeruen fogjak kozre a nullat, hogy lassuk a"); puts(" Vilag-koordinatarendszer tengelyeit is!\n"); printf("x1 (-120) ="); scanf("%lf",&x1Gl); printf("y1 ( -90) ="); scanf("%lf",&y1Gl); printf("x2 ( 120) ="); scanf("%lf",&x2Gl); printf("y2 ( 90) ="); scanf("%lf",&y2Gl); puts("\n A demoban egy haromszoget lehet eltolni, forgatni, nagyitani."); puts("A P1 csucspontot kis kor jelzi."); puts("Add meg a haromszog csucsainak koordinatait a Vilag-KR-ben:\n"); printf("P1x (20)= "); scanf("%lf",&P1x); printf("P1y (20)= "); scanf("%lf",&P1y); printf("P2x (-15)= "); scanf("%lf",&P2x); printf("P2y (-18)= "); scanf("%lf",&P2y); printf("P3x ( 27)= "); scanf("%lf",&P3x); printf("P3y (-21)= "); scanf("%lf",&P3y); puts("\nKezeles a numerikus tasztatura szamaival,"); puts("-,+ forgat, K kicsinyit, N nagyit, V kilep"); puts("\nIndulashoz nyomj Entert!"); getch(); dx= sqrt((P2x-P1x)*(P2x-P1x)+(P2y-P1y)*(P2y-P1y))/20.0; dy= dx; kx=0.9; ky= kx; dalfa= M_PI/20.0; GrStart(x1Gl,y1Gl,x2Gl,y2Gl); if (P1x==P2x) {if (P2y>P1y) alfa=M_PI/2.0; else alfa= -M_PI/2.0; } else {alfa= atan((P2y-P1y)/(P2x-P1x)); if (P1x>P2x) alfa= M_PI - alfa; } do { setcolor(WHITE); line(XK(x1Gl),YK(0.0),XK(x2Gl),YK(0.0)); //Koordinatatengelyek line(XK(0.0),YK(y1Gl),XK(0.0),YK(y2Gl)); line(XK(P1x),YK(P1y),XK(P2x),YK(P2y)); circle(XK(P1x),YK(P1y),3);//nullkor P1 korul setcolor(YELLOW); line(XK(P2x),YK(P2y),XK(P3x),YK(P3y)); line(XK(P3x),YK(P3y),XK(P1x),YK(P1y)); do {do ; while (!kbhit()); bill= toupper(getch()); }while (bill!='2' && bill!='4' && bill!='6' && bill!='8' && bill!='+' && bill!='-' && bill!='N' && bill!='K' && bill!='V'); setcolor(BLACK); //feketevel felulrajyol, torol line(XK(P1x),YK(P1y),XK(P2x),YK(P2y)); circle(XK(P1x),YK(P1y),3);//nullkor P1 korul line(XK(P2x),YK(P2y),XK(P3x),YK(P3y)); line(XK(P3x),YK(P3y),XK(P1x),YK(P1y)); switch (bill) {case '2': Elt(P1x,P1y,0.0,-dy,&P1x,&P1y); Elt(P2x,P2y,0.0,-dy,&P2x,&P2y); Elt(P3x,P3y,0.0,-dy,&P3x,&P3y); break; case '4': Elt(P1x,P1y,-dx,0.0,&P1x,&P1y); Elt(P2x,P2y,-dx,0.0,&P2x,&P2y); Elt(P3x,P3y,-dx,0.0,&P3x,&P3y); break; case '6': Elt(P1x,P1y,dx,0.0,&P1x,&P1y); Elt(P2x,P2y,dx,0.0,&P2x,&P2y); Elt(P3x,P3y,dx,0.0,&P3x,&P3y); break; case '8': Elt(P1x,P1y,0.0,dy,&P1x,&P1y); Elt(P2x,P2y,0.0,dy,&P2x,&P2y); Elt(P3x,P3y,0.0,dy,&P3x,&P3y); break; case 'K': if (sqrt((P2x-P1x)*(P2x-P1x)+(P2y-P2x)*(P2y-P2x))>10e-8) {Zoom(P1x,P1y,kx,ky,&P1x,&P1y); Zoom(P2x,P2y,kx,ky,&P2x,&P2y); Zoom(P3x,P3y,kx,ky,&P3x,&P3y); } break; case 'N': if (sqrt((P2x-P1x)*(P2x-P1x)+(P2y-P2x)*(P2y-P2x))<10e6) {Zoom(P1x,P1y,1/kx,1/ky,&P1x,&P1y); Zoom(P2x,P2y,1/kx,1/ky,&P2x,&P2y); Zoom(P3x,P3y,1/kx,1/ky,&P3x,&P3y); } break; case '-': alfa -= dalfa; Forg(P1x,P1y,-dalfa,&P1x,&P1y); Forg(P2x,P2y,-dalfa,&P2x,&P2y); Forg(P3x,P3y,-dalfa,&P3x,&P3y); break; case '+': alfa += dalfa; Forg(P1x,P1y,dalfa,&P1x,&P1y); Forg(P2x,P2y,dalfa,&P2x,&P2y); Forg(P3x,P3y,dalfa,&P3x,&P3y); break; } } while (bill!='V'); closegraph(); } //fuggveny definiciok: void GrStart(double x1,double y1,double x2,double y2) {x1Gl=x1; y1Gl=y1; x2Gl=x2; y2Gl=y2; detectgraph(&gd,&gm); initgraph(&gd,&gm,"O:\\BC\\BGI"); Lx=getmaxx()/(x2-x1); Ly=getmaxy()/(y2-y1); } int XK(double x) {return floor(Lx*(x-x1Gl)+0.5); //+0.5 kerekites miatt } int YK(double y) {return floor(Ly*(y2Gl-y)+0.5); //+0.5 kerekites miatt } void Elt(double x0, double y0, double dx, double dy, double* x1, double* y1) {*x1= x0+dx; *y1= y0+dy; } void Forg(double x0, double y0, double alfa, double* x1, double* y1) {*x1= x0*cos(alfa)-y0*sin(alfa); *y1= x0*sin(alfa)+y0*cos(alfa); } void Zoom(double x0, double y0, double kx, double ky, double* x1, double* y1) {*x1= kx*x0; *y1= ky*y0; }