// (c) Dinko Korunic, 36355514, kreator@fly.srk.fer.hr // Zadatak broj 6 iz predmeta Racunalna grafika #include #include #include #include #include #define MAXX 640 // max x #define MAXY 480 // max y #define LPOB 8 // modifikator #define MINT 0.1 // modificiranje intenziteta (mnozi) #define DINT 0 // modificiranje intenziteta (zbroji) 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 winx, winy; public: Display *disp; Window win; GC gc; XEvent ev; void MyWait(void); int winsx, winsy, screen; MyDisplay(int _winx, int _winy, int _winsx, int _winsy); ~MyDisplay(); }; MyDisplay::MyDisplay(int _winx=0, int _winy=0, int _winsx=MAXX, int _winsy=MAXY) : 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; } } // vrh poligona struct Vrh { int x, y, z, // koordinate u sustavu scene xo, yo, zo, // koordinate u sustavu oka xp, yp, // koordinate prikaza intenzitet; }; // poligon struct Poligon { int n, // broj vrhova poligona boja; // boja 0-crvena 1-zelena 2-plava 3-siva float A, B, C, D; // koeficijenti ranvine u kojoj lezi poligon Vrh *Polje; // polje vrhova poligona orijentirano u smjeru // kazaljke na satu }; class MiscDraw : public MyDisplay { Colormap cmap; XColor xcolor, colorcell; int darkcolor, lightcolor, black, white; public: XImage *image; long translate[4]; /* for converting colors */ MiscDraw(); }; MiscDraw::MiscDraw() { cmap=DefaultColormap(disp, screen); //XInitImage(image); if (XAllocNamedColor(disp, cmap, "red", &colorcell, &xcolor)) translate[0]=colorcell.pixel; if (XAllocNamedColor(disp, cmap, "green", &colorcell, &xcolor)) translate[1]=colorcell.pixel; if (XAllocNamedColor(disp, cmap, "blue", &colorcell, &xcolor)) translate[2]=colorcell.pixel; if (XAllocNamedColor(disp, cmap, "grey", &colorcell, &xcolor)) translate[3]=colorcell.pixel; image=XGetImage(disp, win, 0, 0, MAXX, MAXY, AllPlanes, ZPixmap); } class MyDraw6 : public MiscDraw { Poligon MyPoligon[2]; // trazila su se dva poligona int *Lx, *Lintenzitet, *Lz, *Dx, *Dintenzitet, *Dz, *Zbuf; void Input(void); void Alociraj(void); void PopuniZbuf(void); void PopuniSpremnike(Poligon *); public: MyDraw6(); }; // unos poligona, koordinata, boja, itd. void MyDraw6::Input(void) { int i, j; for (i=0; i<2; ++i) { cout << "Unesi broj vrhova poligona i boju poligona #" << i << " " << endl; cin >> MyPoligon[i].n; cin >> MyPoligon[i].boja; MyPoligon[i].Polje=new Vrh[MyPoligon[i].n]; for (j=0; j> MyPoligon[i].Polje[j].xp; cin >> MyPoligon[i].Polje[j].yp; cin >> MyPoligon[i].Polje[j].zo; cin >> MyPoligon[i].Polje[j].intenzitet; } } } MyDraw6::MyDraw6() { // ucitavamo Input(); // alociramo memoriju za polja Alociraj(); // zbuf inicijalno mora biti postavljen na najvecu mogucu // udaljenost PopuniZbuf(); // odredujemo vrijednosti u L i D spremnicima int i, j, ymin, ymax, k, t, z, intenzitet; double derz, derintenzitet; for (i=0; in; ++i) { // odredujemo u koji se spremnik spremaju vrijednosti if (P->Polje[i].yp>P->Polje[(i+1)%P->n].yp) { adrx=Dx; adrz=Dz; adrintenzitet=Dintenzitet; yodluka=-1; } else { adrx=Lx; adrz=Lz; adrintenzitet=Lintenzitet; yodluka=1; } // radimo DDA postupak za x spremnike if (P->Polje[i].xpPolje[(i+1)%P->n].xp) xodluka=1; else xodluka=-1; xi=P->Polje[i].xp; xf=-abs(P->Polje[(i+1)%P->n].yp-P->Polje[i].yp); if (xf) { mi=abs((P->Polje[(i+1)%P->n].xp-P->Polje[i].xp) /(P->Polje[(i+1)%P->n].yp-P->Polje[i].yp)); mf=abs(2*((P->Polje[(i+1)%P->n].xp-P->Polje[i].xp) %(P->Polje[(i+1)%P->n].yp-P->Polje[i].yp))); for (ybrojac=P->Polje[i].yp; yodluka*ybrojac<=yodluka *(P->Polje[(i+1)%P->n].yp); ybrojac+=yodluka) { adrx[ybrojac]=xi; xi+=xodluka*mi; xf+=mf; if (xf>=0) { xi+=xodluka; xf-=2*abs(P->Polje[(i+1)%P->n].yp -P->Polje[i].yp); } } } else { if (P->Polje[i].xp>P->Polje[(i+1)%P->n].xp) Dx[P->Polje[i].yp]=xi; else Lx[P->Polje[i].yp]=xi; } // radimo DDA postupak za z spremnike // ovdje xodluka ima odluku zodluke (tj, da li vrijednost // po z-u raste ili pada) if (P->Polje[i].zoPolje[(i+1)%P->n].zo) xodluka=1; else xodluka=-1; xi=P->Polje[i].zo; xf=-abs(P->Polje[(i+1)%P->n].yp-P->Polje[i].yp); if (xf) { mi=abs((P->Polje[(i+1)%P->n].zo -P->Polje[i].zo)/(P->Polje[(i+1)%P->n].yp -P->Polje[i].yp)); mf=abs(2*((P->Polje[(i+1)%P->n].zo-P->Polje[i].zo) %(P->Polje[(i+1)%P->n].yp-P->Polje[i].yp))); for (ybrojac=P->Polje[i].yp; yodluka*ybrojac<=yodluka*(P->Polje[(i+1)%P->n].yp); ybrojac+=yodluka) { adrz[ybrojac]=xi; xi+=xodluka*mi; xf+=mf; if (xf>=0) { xi+=xodluka; xf-=2*abs(P->Polje[(i+1)%P->n].yp -P->Polje[i].yp); } } } else { if (P->Polje[i].xp>P->Polje[(i+1)%P->n].xp) Dz[P->Polje[i].yp]=xi; else Lz[P->Polje[i].yp]=xi; } // radimo DDA postupak za intenzitet medju pojedinim linijama if (P->Polje[i].intenzitetPolje[(i+1)%P->n].intenzitet) xodluka=1; else xodluka=-1; xi=P->Polje[i].intenzitet; xf=-abs(P->Polje[(i+1)%P->n].yp-P->Polje[i].yp); if (xf) { mi=abs((P->Polje[(i+1)%P->n].intenzitet -P->Polje[i].intenzitet) /(P->Polje[(i+1)%P->n].yp-P->Polje[i].yp)); mf=abs(2*((P->Polje[(i+1)%P->n].intenzitet- P->Polje[i].intenzitet)% (P->Polje[(i+1)%P->n].yp-P->Polje[i].yp))); for (ybrojac=P->Polje[i].yp; yodluka*ybrojac<= yodluka*(P->Polje[(i+1)%P->n].yp); ybrojac+=yodluka) { adrintenzitet[ybrojac]=xi; xi+=xodluka*mi; xf+=mf; if (xf>=0) { xi+=xodluka; xf-=2*abs(P->Polje[(i+1)%P->n].yp- P->Polje[i].yp); } } } else { if (P->Polje[i].xp>P->Polje[(i+1)%P->n].xp) Dintenzitet[P->Polje[i].yp]=xi; else Lintenzitet[P->Polje[i].yp]=xi; } } } int main(void) { MyDraw6 MyOb; return EXIT_SUCCESS; }