Piirtää Mandelbrot fraktaalin SDL:ää käyttäen.
Voi tsuumailla helposti koodia puukottamalla.
Toimii ainakin Linuxissa moitteetta, kääntyy komennolla
g++ mandelbrot.cpp -o mandelbrot -lSDL -lpthread
Olettaisin että windowsillakin toimii kun vaan ajaa kääntäjästä läpi.
/* Mandelbrot efekti * Voi zoomailla helposti koodia muokkaamalla niin * pitkälle kuin muuttujat antavat. * Jos kääntäjäsi ei tue long double -muuttujia (joka ei ole standardi), * käytä doublea, jolloin tosin zoomaus ei onnistu yhtä pitkälle. * * (c) Tomageeni 2004 */ #include <SDL/SDL.h> #include <math.h> #define ZOOMI 120 // MAX 120 koko kuviolla #define KIRKKAUS 50 SDL_Surface *screen; int main(int argc, char *argv[]) { int done = 0, key, *v, p; bool go_on = true; /* Luokka lähinnä asioiden helpottamiseksi/selventämiseksi */ class mandelbrot { public: long double r, i; long double x, y, w, h; }; mandelbrot n; /* Jos haluat zoomailla kuvaa, niin n.x ja n.y ovat zoomatun kohdan * koordinaatit (-2 .. 2) ja n.w ja n.h zoomatun kohdan korkeus/leveys (0 .. 4) */ n.x = -2; n.y = -2; n.w = 4; n.h = 4; long double a=0, i=0, m = 0, mx = 0; /* Lasketaan kuinka paljon x ja y -muuttujia pitää lisätä per-luuppi * jotta käytetään sopiva määrä pikseleitä kuvan piirtämiseen */ long double foo; foo = ZOOMI; foo =0.01 * (100 / foo); foo *= (1-foo*10); screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); v = (int*)screen->pixels; p = screen->pitch/4; if(screen == NULL) fprintf(stderr, "Resoluutio 640x480 ei lähde käyntiin, erroria: %s\n", SDL_GetError()); /* Piirretään itse efekti */ for(long double y=n.y; y<n.y+n.h; y += foo) for(long double x=n.x; x<n.x+n.w; x+= foo) { n.r = 0; n.i = 0; i = 1; m = 0; mx = 0; go_on = true; do { a = n.r; n.r = n.r*n.r - n.i*n.i; n.i = a*n.i+a*n.i; n.r += x; n.i += y; a= n.r*n.r+n.i*n.i; if(a > m) m = a; mx = i; if(a >= 4) go_on = false; i++; }while(go_on && i <= 150); if(i < KIRKKAUS) mx += KIRKKAUS; v[(int)(y*ZOOMI+ (-1*n.y*ZOOMI)) *p+(int)(x*ZOOMI+ (-1*n.x*ZOOMI))]= SDL_MapRGB(screen->format, 0, (unsigned char)mx, 0); } SDL_Flip(screen); SDL_Delay(3000); SDL_FreeSurface(screen); SDL_Quit(); return 0; }
ompa sotkuista koodia, no en valita.
Oikeastaan ei ole efekti vaan fraktaali..
Kaviaari kirjoitti:
Oikeastaan ei ole efekti vaan fraktaali..
Tomaattigeeni kirjoitti:
Koodivinkit: C/C++: Grafiikka: Mandelbrot "efekti"
Piirtää Mandelbrot fraktaalin SDL:ää käyttäen.
Saa sitä optimointiakin harrastaa, hidas kuin tuska :) Ja kyllä long double käsittääkseni ihan standardi on. Mutta ihan jees.
Karu totuus toi fawkzin kommentti, nyt (ainakin omalla masiinallani) nopeutui huomattavasti kun toiseen korottamisessa käytin vain n*n:ää pow() -funktion sijaan. Myös yo. vinkkiin päivitetty tuo.
Mistä SDL?
Aihe on jo aika vanha, joten et voi enää vastata siihen.