1.1 --- a/script.js Mon Jul 05 17:19:17 2010 +0200
1.2 +++ b/script.js Tue Jul 06 00:05:38 2010 +0200
1.3 @@ -151,6 +151,8 @@
1.4 var max_c = MAX_C;
1.5 var max_iter = 100;
1.6 var zoom = 1.0;
1.7 +var resolution = 3;
1.8 +var bailout = 4.0;
1.9
1.10 function Result(z, iter)
1.11 {
1.12 @@ -174,6 +176,11 @@
1.13 return new Complex(c1.real + c2.real, c1.imag + c2.imag);
1.14 }
1.15
1.16 +function complex_equal(c1, c2)
1.17 +{
1.18 + return (c1.real == c2.real) && (c1.imag == c2.imag);
1.19 +}
1.20 +
1.21 function iterate(z, c)
1.22 {
1.23 z_quad = complex_quad(z);
1.24 @@ -184,63 +191,71 @@
1.25 {
1.26 var iter = 0;
1.27 var z = new Complex(0.0, 0.0);
1.28 - while (complex_quad_value(z) <= 4.0
1.29 - && iter < max_iter)
1.30 + var last_z = new Complex(-1.0, 0.0);
1.31 + var quad_z = complex_quad_value(z);
1.32 +
1.33 + while (iter < max_iter
1.34 + && !complex_equal(z, last_z)
1.35 + && quad_z <= bailout)
1.36 {
1.37 + last_z = z;
1.38 z = iterate(z, c);
1.39 + quad_z = complex_quad_value(z);
1.40 iter++;
1.41 }
1.42 - return new Result(z, iter);
1.43 + return new Result(quad_z, iter);
1.44 }
1.45
1.46 -function draw(iter, x, y, z)
1.47 +function draw(iter, dx, dy, dz, dres)
1.48 {
1.49 - var canvas = document.getElementById('mandelbrot');
1.50 + var canvas = document.getElementById('mandelbrot');
1.51 +
1.52 if (canvas.getContext)
1.53 {
1.54 + zoom += dz;
1.55 var ctx = canvas.getContext('2d');
1.56 - z = z / 10.0;
1.57 - zoom += z;
1.58 - if (zoom < 1)
1.59 - zoom = 1;
1.60 - x = x / 10.0 / zoom;
1.61 - y = y / 10.0 / zoom;
1.62 - var min_inc = new Complex(x + z, y + z);
1.63 - var max_inc = new Complex(x - z, y - z);
1.64 +
1.65 + if (dres != 0)
1.66 + {
1.67 + resolution = Math.max(1, resolution + dres);
1.68 + }
1.69 +
1.70 + var width = canvas.width;
1.71 + var height = canvas.height;
1.72 + var dim = Math.max(width, height);
1.73 + var dim_ratio = Math.round(width / height);
1.74 + var diff_c = new Complex(max_c.real - min_c.real,
1.75 + max_c.imag - min_c.imag);
1.76 + dx_min = diff_c.real / 100 * (dx + dz);
1.77 + dx_max = diff_c.real / 100 * (dx - dz);
1.78 +
1.79 + dy_min = diff_c.imag / 100 * (dy + dz);
1.80 + dy_max = diff_c.imag / 100 * (dy - dz);
1.81 +
1.82 + var min_inc = new Complex(dx_min * dim_ratio / 2.0, dy_min);
1.83 + var max_inc = new Complex(dx_max * dim_ratio / 2.0, dy_max);
1.84 min_c = complex_add(min_c, min_inc);
1.85 max_c = complex_add(max_c, max_inc);
1.86 max_iter += iter;
1.87 - var diff_c = new Complex(max_c.real - min_c.real,
1.88 + diff_c = new Complex(max_c.real - min_c.real,
1.89 max_c.imag - min_c.imag);
1.90 - var width = canvas.width;
1.91 - var height = canvas.height;
1.92 - var dim = Math.max(width, height);
1.93 - ctx.clearRect(0, 0, width, height);
1.94
1.95 - for (var y = 0; y < height; y++)
1.96 + for (var y = 0; y < height; y += resolution)
1.97 {
1.98 - for (var x = 0; x < width; x++)
1.99 - {
1.100 - if (true)
1.101 - {
1.102 - var c = new Complex(min_c.real + diff_c.real
1.103 - / dim * x,
1.104 - min_c.imag + diff_c.imag / dim * y);
1.105 - var result = test(c, max_iter);
1.106 -
1.107 - if (result.iter < max_iter)
1.108 - {
1.109 - var r = Math.min(255, Math.pow(Math.max(0,
1.110 - (result.iter - max_iter / 20.0)), 2));
1.111 - var g = Math.min(255, Math.pow(Math.max(0,
1.112 - (result.iter - max_iter / 25.0)), 2));
1.113 - var b = Math.min(255, Math.pow(Math.max(0,
1.114 - (result.iter - max_iter / 20.0)), 2));
1.115 - var colour = r + "," + g + "," + b;
1.116 - ctx.fillStyle = "rgb(" + colour + ")";
1.117 - ctx.fillRect(x, y, 1, 1);
1.118 - }
1.119 - }
1.120 + for (var x = 0; x < width; x += resolution)
1.121 + {
1.122 + var c = new Complex(min_c.real + diff_c.real / dim * x,
1.123 + min_c.imag + diff_c.imag / dim * y);
1.124 + var result = test(c, max_iter);
1.125 + var r = Math.min(255, Math.pow(Math.max(0,
1.126 + (result.iter - max_iter / 20.0)), 2));
1.127 + var g = Math.min(255, Math.pow(Math.max(0,
1.128 + (result.iter - max_iter / 25.0)), 2));
1.129 + var b = Math.min(255, Math.pow(Math.max(0,
1.130 + (result.iter - max_iter / 20.0)), 2));
1.131 + var colour = r + "," + g + "," + b;
1.132 + ctx.fillStyle = "rgb(" + colour + ")";
1.133 + ctx.fillRect(x, y, resolution, resolution);
1.134 }
1.135 }
1.136 }