Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
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 → ∞} J = {z0| ┐(zn = (zn-1)2 + c → ∞)} or Definitions • Mandelbrot set is set of c’s for which the sequence does not diverge for z0 = 0 • formally: J = C - {c|z0 = 0, zn = (zn-1)2 + c → ∞} J = {c|z0 = 0, ┐(zn = (zn-1)2 + c → ∞)} or 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) { for (every imaginary part for z0) { //should be between -2 and 2 //should be between -2 and 2 z := z0 ; for (fixed number of iterations) { z = z^2 + c; if (|z| > 2) break; } //120 is ok // or |z|^2 > 4 drawPixel(Re(z0), Im(z0), #iterations needed); } } Mandelbrot set – sudocode for (every real part for c) { for (every imaginary part for c) { z := c; //should be between -2 and 2 //should be between -2 and 2 //z0=0, therefore z1=c for (fixed number of iterations) { z = z^2 + c; if (|z| > 2) break; } //40 is ok here // 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