// (c) Dinko Korunic, 36355514, kreator@fly.srk.fer.hr // Zadatak broj 5 iz predmeta Racunalna grafika #include #include #include #include #include class MyDisplay { // klasa MyDisplay u kojoj se nalaze inicijalizacijske xlib // rutine, kao i postavljanje background i foreground boje, itd. XGCValues gcv; unsigned long wp, bp; int screen, winx, winy; public: Display *disp; Window win; GC gc; XEvent ev; void MyWait(void); int winsx, winsy; MyDisplay(int _winx, int _winy, int _winsx, int _winsy); ~MyDisplay(); }; MyDisplay::MyDisplay(int _winx=0, int _winy=0, int _winsx=400, int _winsy=400) : winx(_winx), winy(_winy), winsx(_winsx), winsy(_winsy) { // konstruktor koji sluzi za misc. inicijalizaciju cout << "Initialising graphic subsystem.." << endl; // otvaranje displaya if ((disp=XOpenDisplay(NULL))==NULL) { cerr << "I can't open display." << endl; exit(EXIT_FAILURE); } screen=DefaultScreen(disp); // stvaranje prototipnog prozora win=XCreateSimpleWindow(disp, DefaultRootWindow(disp), winx, winy, winsx, winsy, 1, wp=WhitePixel(disp, screen), bp=BlackPixel(disp, screen)); XSelectInput(disp, win, StructureNotifyMask | KeyPressMask | ExposureMask); // mapiranje prozora XMapWindow(disp, win); while(1) { // cekaj dok nije gotovo XNextEvent(disp, &ev); if (ev.type==MapNotify) break; } gcv.foreground=wp; gcv.background=bp; // stvori gc gc=XCreateGC(disp, win, GCForeground | GCBackground, &gcv); cout << "done." << endl; } MyDisplay::~MyDisplay() { // destruktor za graficki engine cout << "Shutting graphic subsystem.." << endl; XFreeGC(disp, gc); XDestroyWindow(disp, win); XCloseDisplay(disp); cout << "done." << endl; } void MyDisplay::MyWait(void) { // postavi wait na keypress XSelectInput(disp, win, KeyPressMask | ExposureMask); while(1) { XNextEvent(disp, &ev); if (ev.type==KeyPress) break; } } struct Vrh { // vrh poligona int x, y, z; // koordinate u sustavu scene double xo, yo, zo; // koordinate u sustavu oka int xp, yp; // koordinate prikaza }; struct Polig { // poligon int n; // broj vrhova poligona Vrh *Polje; // polje vrhova poligona orijentirane u smjeru // kazaljke na satu float A, B, C, D; // koeficijenti ravnine u kojoj lezi poligon }; class MyDraw5 : public MyDisplay { Vrh Ociste; Vrh Glediste; Polig Poligon; public: void TransformView(Vrh *); void Projection(Vrh *); void Input(void); MyDraw5(); }; MyDraw5::MyDraw5() { Input(); int i; for (i=0; ixo=tmpV->x*sina-tmpV->y*cosa-Ociste.x*sina+Ociste.y*cosa; tmpV->yo=-tmpV->x*cosa*cosb-tmpV->y*sina*cosb+tmpV->z*sinb +Ociste.x*cosa*cosb+Ociste.y*sina*cosb-Ociste.z*sinb; tmpV->zo=tmpV->x*cosa*sinb+tmpV->y*sina*sinb+tmpV->z*cosb -Ociste.x*cosa*sinb-Ociste.y*sina*sinb-Ociste.z*cosb; Glediste.xo=Glediste.yo=0; Glediste.zo=sqrt(xg1*xg1+yg1*yg1+zg1*zg1); } void MyDraw5::Projection(Vrh *tmpV) { tmpV->xp=tmpV->xo/tmpV->zo*Glediste.zo; tmpV->yp=tmpV->yo/tmpV->zo*Glediste.zo; } void MyDraw5::Input(void) { // procitaj koordinate ocista i gledista cout << "Koordinate ocista" << endl; cin >> Ociste.x; cin >> Ociste.y; cin >> Ociste.z; cout << "Koordinate gledista" << endl; cin >> Glediste.x; cin >> Glediste.y; cin >> Glediste.z; // procitati broj vrhova poligona cout << "Broj vrhova poligona" << endl; cin >> Poligon.n; Poligon.Polje=new Vrh[Poligon.n]; int i; cout << "Unos koordinata" << endl; for (i=0; i> Poligon.Polje[i].x; cin >> Poligon.Polje[i].y; cin >> Poligon.Polje[i].z; } } int main(void) { MyDraw5 MyOb; return EXIT_SUCCESS; }