diff -r d33f0b00f8d9 -r cfde0597a8dc script.js --- a/script.js Sat Jun 19 00:12:34 2010 +0200 +++ b/script.js Sun Jul 04 00:11:17 2010 +0200 @@ -137,3 +137,105 @@ //document.write(request.responseText); document.getElementById('footer').innerHTML = request.responseText; } + +// Mandelbrot functions +function Complex(real, imag) +{ + this.real = real; + this.imag = imag; +} + +var MIN_C = new Complex(-2.2, -1.4); +var MAX_C = new Complex(1.0, 1.4); +var min_c = MIN_C; +var max_c = MAX_C; +var max_iter = 100; +var zoom = 0.1; + +function Result(z, iter) +{ + this.z = z; + this.iter = iter; +} + +function complex_quad(c) +{ + return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2), + 2.0 * c.real * c.imag); +} + +function complex_quad_value(c) +{ + return Math.pow(c.real, 2) + Math.pow(c.imag, 2); +} + +function complex_add(c1, c2) +{ + return new Complex(c1.real + c2.real, c1.imag + c2.imag); +} + +function iterate(z, c) +{ + z_quad = complex_quad(z); + return new Complex(z_quad.real + c.real, z_quad.imag + c.imag); +} + +function test(c, max_iter) +{ + var iter = 0; + var z = new Complex(0.0, 0.0); + while (complex_quad_value(z) <= 4.0 + && iter < max_iter) + { + z = iterate(z, c); + iter++; + } + return new Result(z, iter); +} + +function draw(iter, x, y, z) +{ + var canvas = document.getElementById('mandelbrot'); + if (canvas.getContext) + { + var ctx = canvas.getContext('2d'); + zoom += z / 10.0; + x = x / 30.0 / zoom; + y = y / 30.0 / zoom; + var min_inc = new Complex(x + zoom, y + zoom); + var max_inc = new Complex(x - zoom, y - zoom); + min_c = complex_add(min_c, min_inc); + max_c = complex_add(max_c, max_inc); + max_iter += iter; + var diff_c = new Complex(max_c.real - min_c.real, + max_c.imag - min_c.imag); + var width = canvas.width; + var height = canvas.height; + var dim = Math.max(width, height); + ctx.clearRect(0, 0, width, height); + + for (var y = 0; y < height; y++) + { + for (var x = 0; x < width; x++) + { + if (true) + { + var c = new Complex(min_c.real + diff_c.real + / dim * x, + min_c.imag + diff_c.imag / dim * y); + var result = test(c, max_iter); + + if (result.iter < max_iter) + { + var r = result.iter * 3; + var g = result.iter * 3; + var b = result.iter * 3; + var colour = r + "," + g + "," + b; + ctx.fillStyle = "rgb(" + colour + ")"; + ctx.fillRect(x, y, 1, 1); + } + } + } + } + } +}