170 likes | 518 Views
Mandelbrot and Julian sets. Vaclav Vavra. Definitions . By both sets we compute the same sequence given by recursive formula: z n = (z n-1 ) 2 + c z n , z n-1 , c are complex numbers(!) Julian set is set of z 0 ’s for which the sequence does not diverge
E N D
Mandelbrot and Julian sets Vaclav Vavra
Definitions • By both sets we compute the same sequence given by recursive formula: zn = (zn-1)2 + c • zn , zn-1, c are complex numbers(!) • Julian set is set of z0’s for which the sequence does not diverge • (c is constant for a given Julian set) • formally: J = C - {z0| zn = (zn-1)2 + c→ ∞} or J = {z0| ┐(zn = (zn-1)2 + c→ ∞)}
Definitions • Mandelbrot set is set of c’sfor which the sequence does not diverge for z0 = 0 • formally: J = C - {c|z0 = 0, zn = (zn-1)2 + c→ ∞} or J = {c|z0 = 0, ┐(zn = (zn-1)2 + c→ ∞)}
Operations in C • Notation: x = a + b.i • a is real part, b is imaginary part, i is imaginary unit, i2=-1 • Operations: y = c + d.i x + y = (a+c) + (b+d).i x.y = (ac−bd) + (bc+ad).i |x| = sqrt(a2 + b2)
Visualisation • for a given c, z0 we compute z1, z2, z3,…in a loop • this way we cannot analytically determine, whether the sequence diverges • However if |zn| > 2, it really diverges • if |zn| is still <= 2, we just stop after fixed number of iterations • It works
Julian set – sudocode const complex c = {c.r,c.i}; for (every real part for z0) { //should be between -2 and 2 for (every imaginary part for z0) { //should be between -2 and 2 z := z0 ; for (fixed number of iterations) { //120 is ok z = z^2 + c; if (|z| > 2) break; // or |z|^2 > 4 } drawPixel(Re(z0), Im(z0), #iterations needed); } }
Mandelbrot set – sudocode for (every real part for c) { //should be between -2 and 2 for (every imaginary part for c) { //should be between -2 and 2 z := c; //z0=0, therefore z1=c for (fixed number of iterations) { //40 is ok here z = z^2 + c; if (|z| > 2) break; // or |z|^2 > 4 } drawPixel(Re(z0), Im(z0), #iterations needed); } }
Colors • We map #iterations to colors • Various ways how to do it • Besides #iterations #maximum number of iterations (maxiter) • We want to set values for r,g,b • Maybe you want point inside the set to be black • If (#iterations == maxiter) r = b = g = 0; Examples: a) (r,g,b are floats from 0.0 to 1.0) r = 1-(1-#iterations/maxiter)^5; g = 1-(1-#iterations/maxiter)^3; b = #iterations/maxiter;
Colors b) (r,g,b are integers from 0 to 255) int colorTable[16][3] = { { 0, 0, 0}, { 0, 0,170}, { 0,170, 0}, { 0,170,170}, {170, 0, 0}, {170, 0,170}, {170, 85, 0}, {170,170,170}, { 85, 85, 85}, { 85, 85,255}, { 85,255, 85}, { 85,255,255}, {255, 85, 85}, {255, 85,255}, {255,255, 85}, {255,255,255}, }; r = colorTable[#iterations % 16][0]; g = colorTable[#iterations % 16][1]; b = colorTable[#iterations % 16][2]; You can find other examples at http://www.root.cz/clanky/fraktaly-v-pocitacove-grafice-xiv/
Tips and tricks • colors: instead of mapping #iterations to colors, we can map zn (the last one before we leave the loop) to colors • So now we have drawPixel(Re(z0), Im(z0), Re(zn), Im(zn)); • We can use it for the inside if the set too!! • Until now we get drawPixel(Re(z0), Im(z0),maxiter) there • Mandelbrot set – if we set z0 to a non-zero value, we get the set deformed • z0 is then called the “perturbation” term • Set the maximum number of iterations to a small number and we have the sets deformed, too (particularly useful for Mandelbrot set)
References • http://www.root.cz/clanky/fraktaly-v-pocitacove-grafice-xiv • http://www.cis.ksu.edu/~vaclav/fractals.html