// (c) Dinko Korunic, 36355514, kreator@fly.srk.fer.hr // Zadatak broj 2 iz predmeta Racunalna grafika #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, winsx, winsy; public: Display *disp; Window win; GC gc; XEvent ev; 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; } struct Node_t { int x, y; // node type }; struct Poly_t { int CoordCount; // broj koordinata poligona Node_t *PolyPtr; // pokazivac na matricu sa koordinatama poligona Node_t *PointPtr; // pokazivac na matricu sa koordinatama tocke }; class MyDraw2 : public MyDisplay { Poly_t MyPolyPtr; long *a, *b, *c; int xmin, xmax, ymin, ymax; void MyInit(void); void MyCalcCoef(void); void MyCheckPointPoly(void); void MyPolyFill(void); void MyWait(void); void MyDrawPoly(void); public: MyDraw2(Poly_t tmpSrc); }; MyDraw2::MyDraw2(Poly_t tmpSrc) : MyPolyPtr(tmpSrc) { MyInit(); MyDrawPoly(); MyCalcCoef(); MyCheckPointPoly(); XFlush(disp); MyWait(); MyPolyFill(); XFlush(disp); MyWait(); } void MyDraw2::MyInit(void) { // nadjemo ymin, ymax, xmin, xmax int i, tmpP; xmin=xmax=MyPolyPtr.PolyPtr[0].x; ymin=ymax=MyPolyPtr.PolyPtr[0].y; for(i=0; ixmax) xmax=tmpP; if (tmpPymax) ymax=tmpP; if (tmpP0) { cout << "Tocka V je izvan poligona" << endl; break; } } if (i==MyPolyPtr.CoordCount) cout << "Tocka V je unutar poligona" << endl; // i nacrtaj tocku! XDrawPoint(disp, win, gc, x1, y1); } void MyDraw2::MyPolyFill(void) { // punjenje poligona int L, D, x11, y0, i; for (y0=ymin; y0<=ymax; ++y0) { L=xmin; D=xmax; for (i=0; iL) L=x11; if (MyPolyPtr.PolyPtr[i].y >=MyPolyPtr.PolyPtr[i+1].y && x11> tmpPolyPtr.CoordCount; } while (tmpPolyPtr.CoordCount<3); // alociraj prostor za n vrhova tmpPolyPtr.PolyPtr=new Node_t[tmpPolyPtr.CoordCount+1]; int i; for (i=0; i> tmpPolyPtr.PolyPtr[i].x; cin >> tmpPolyPtr.PolyPtr[i].y; } tmpPolyPtr.PolyPtr[i]=tmpPolyPtr.PolyPtr[0]; tmpPolyPtr.PointPtr=new Node_t[1]; cout << "Unesi x,y koordinate tocke V(x1,y1) "; cin >> tmpPolyPtr.PointPtr[0].x; cin >> tmpPolyPtr.PointPtr[0].y; return tmpPolyPtr; } int main(void) { MyDraw2 MyDraw2Object(MyAllInput()); return EXIT_SUCCESS; }