// (c) Dinko Korunic, 36355514, kreator@fly.srk.fer.hr // Zadatak broj 9 iz predmeta Racunalna grafika #include #include #include #include #include #include #define MAXX 640 // max x #define MAXY 480 // max y #define MINT 0.09 // mnozi paletu #define MYSTEP 1 // stepping za iscrtavanje pixela 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; } } 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); 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 MyDraw9 : public MiscDraw { int Interate(double, double, int, double, double, double); public: MyDraw9(); }; int Iterate(double x, double y, int numiter, double bailout, double a, double b) { // vraca 0 ako konvergira, ili broj iteracija ako divergira (ode // preko bailout vrijednosti) double xt; for (int it=0; it=bailout) return it; xt=x; x=x*x-y*y+a; y=2*xt*y+b; } return 0; } MyDraw9::MyDraw9() { double bailout=2., a, b; int i, j, numiter=400; // crta mandelbrotov skup for (j=0; j