### ASCII Mandelbrot Realtime Zoom

not only that, but its 447 bytes of C source (with license header, copyright statement and indented code), and you can even specify the spot to which the realtime zoom will go on the command line

Update: new version with more nasty tricks and less whitespace only needs 285 bytes of C source

I recently explained the source code to someone, I hope you don’t mind me posting it here in case someone stumbles across this code and wants to understand it..

————–

> Can you please decipher the code for me?

> What do we see on the screen? Is it supposed to be a mandelbrot set?

> It seems that odd lines and even lines have different roles.

It is pretty straightforward: The entire code is 4 nested loops –

1. an entire picture, at different zoom

2. a single line of a picture

3. a single character/pixel inside a line

4. the calculation of the color of a single pixel

> #define A c>2?atof(*++v):

> main(int c,int**v){float

> atof(),x,y,p=1,r,i,t,X=A.105,Y=A.928;

so far, initialization and reading params – X and Y is the zoom-in

location, and they have a default of “0.105” and “0.928”. what “A”

does is attempt to read from command line, otherwise uses the default

written after it

> for(;p>.003;p*=.98,printf(“33[35A”))

This is the biggest loop, running once for each zoom in level.

Starting at zoom “p=1”, and exponentially (at 0.98) zooming in until

“0.003”.

The “printf” clears the screen for the next zoom in at every iteration

> for(y=-1.2;y for(x=-1.6;x printf(“33[4%dm%c33[0m”,c&7,x>1?’\n’:32))

The actual printing of a single pixel, done once for every ‘x’ in the

loop above. The color is decided by variable “c”, explained below. For

all “x for(r=i=0,c=6;c<256&r*r+i*i2, then the color would be a certain

color, and if it took 133 iterations, it would be a different colors.

if c=256, then the color is black, the position is in the Mandlebrot

set.

> t=r*r-i*i-X+(x+X)*p,i=r*i*2+Y+(y-Y)*p,r=t;}

The actual calculation of “Zn+1=Zn^2+c”. “c” here is calculated by

“p”, “x”, “y”, “X” and “Y” – zoom level, current pixel, and target

location.

I didn’t notice any difference between odd and even lines… If you

meant “c&7”, then that is the color calculation – there are 7

different available colors, and “c&7” means taking the lowest 3 bits

of “c” for deciding the color (i.e. when c=130, it gives the same

color as c=138, c=146, c=2, …)

Oded

Comment by Oded — May 12, 2009 @ 20:12

ouch, the html <> mangled it :(

I’ll post again, feel free to delete the previous message

——————-

> Can you please decipher the code for me?

> What do we see on the screen? Is it supposed to be a mandelbrot set?

> It seems that odd lines and even lines have different roles.

It is pretty straightforward: The entire code is 4 nested loops –

1. an entire picture, at different zoom

2. a single line of a picture

3. a single character/pixel inside a line

4. the calculation of the color of a single pixel

> #define A c>2?atof(*++v):

> main(int c,int**v){float

> atof(),x,y,p=1,r,i,t,X=A.105,Y=A.928;

so far, initialization and reading params – X and Y is the zoom-in

location, and they have a default of “0.105” and “0.928”. what “A”

does is attempt to read from command line, otherwise uses the default

written after it

> for(;p>.003;p*=.98,printf(“33[35A”))

This is the biggest loop, running once for each zoom in level.

Starting at zoom “p=1”, and exponentially (at 0.98) zooming in until

“0.003”.

The “printf” clears the screen for the next zoom in at every iteration

> for(y=-1.2;y<1.2;y+=.07)

The y axis, this loops runs once for every line shown, a total of

2.4/0.07= 34 lines high

> for(x=-1.6;x<1;x+=.03,

The x axis, this runs once for every *pixel* – single character. total

width 2.6/0.03=86 characters wide

> printf(“33[4%dm%c33[0m”,c&7,x>1?’\n’:32))

The actual printing of a single pixel, done once for every ‘x’ in the

loop above. The color is decided by variable “c”, explained below. For

all “x<=1” a space is printed (character 32), otherwise, a newline –

meaning, we reached the end of the line, and the “x” loop breaks and

starts all over again for the next line

> for(r=i=0,c=6;c<256&r*r+i*i<4;c++)

Calculation loop – runs at most 256 times for each pixel. Stops when

the absolute value of the Zn is bigger than 2, or after 256 iterations

and the absolute value is still small.

The color is decided by how many times this loop ran until the

absolute value got too high, counted by “c”. If “c” was 132, meaning,

it took 132 iterations until |Zn|>2, then the color would be a certain

color, and if it took 133 iterations, it would be a different colors.

if c=256, then the color is black, the position is in the Mandlebrot

set.

> t=r*r-i*i-X+(x+X)*p,i=r*i*2+Y+(y-Y)*p,r=t;}

The actual calculation of “Zn+1=Zn^2+c”. “c” here is calculated by

“p”, “x”, “y”, “X” and “Y” – zoom level, current pixel, and target

location.

I didn’t notice any difference between odd and even lines… If you

meant “c&7”, then that is the color calculation – there are 7

different available colors, and “c&7” means taking the lowest 3 bits

of “c” for deciding the color (i.e. when c=130, it gives the same

color as c=138, c=146, c=2, …)

Oded

Comment by Oded — May 12, 2009 @ 20:15