Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Mandelbrotin fraktaali

Sivun loppuun

tomaattigeeni [13.07.2004 02:01:02]

#

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;
}

BlueByte [13.07.2004 15:10:45]

#

ompa sotkuista koodia, no en valita.

kaviaari [15.07.2004 09:54:59]

#

Oikeastaan ei ole efekti vaan fraktaali..

Minä [15.07.2004 10:35:22]

#

Kaviaari kirjoitti:

Oikeastaan ei ole efekti vaan fraktaali..

Tomaattigeeni kirjoitti:

Koodivinkit: C/C++: Grafiikka: Mandelbrot "efekti"
Piirtää Mandelbrot fraktaalin SDL:ää käyttäen.

thefox [15.07.2004 22:46:51]

#

Saa sitä optimointiakin harrastaa, hidas kuin tuska :) Ja kyllä long double käsittääkseni ihan standardi on. Mutta ihan jees.

tomaattigeeni [16.07.2004 00:52:54]

#

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.

water flea [19.07.2004 21:58:11]

#

Mistä SDL?

tomaattigeeni [20.07.2004 13:21:57]

#

http://www.libsdl.org


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta