script.js
changeset 17 a264da3d80be
parent 13 e6eb1311a49c
child 20 adbea491e9b9
     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  	}