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.