factory/v2011/canvas_client.html
author Eugen Sawin <sawine@me73.com>
Mon, 16 Jan 2012 05:20:30 +0100
changeset 98 6db2119b1ee1
permissions -rw-r--r--
Removed the no canvas message.
sawine@31
     1
<html>  
sawine@31
     2
	<head>  
sawine@31
     3
    	<title>Canvas Xaoc Client</title>  
sawine@31
     4
    	<script type="text/javascript"> 
sawine@31
     5
    		function Complex(real, imag) 
sawine@31
     6
    		{
sawine@31
     7
				this.real = real;
sawine@31
     8
				this.imag = imag;
sawine@31
     9
    		}
sawine@31
    10
    		
sawine@31
    11
    		var MIN_C = new Complex(-2.2, -1.4);
sawine@31
    12
    		var MAX_C = new Complex(1.0, 1.4);
sawine@31
    13
    		var min_c = MIN_C;
sawine@31
    14
    		var max_c = MAX_C;
sawine@31
    15
    		var max_iter = 100;
sawine@31
    16
    		var zoom = 1.0;
sawine@31
    17
    		
sawine@31
    18
    		function Result(z, iter) 
sawine@31
    19
    		{
sawine@31
    20
    			this.z = z;
sawine@31
    21
    			this.iter = iter;
sawine@31
    22
    		}
sawine@31
    23
sawine@31
    24
			function complex_quad(c)
sawine@31
    25
			{
sawine@31
    26
				return new Complex(Math.pow(c.real, 2) - Math.pow(c.imag, 2), 
sawine@31
    27
					2.0 * c.real * c.imag);
sawine@31
    28
			}
sawine@31
    29
			
sawine@31
    30
			function complex_quad_value(c)
sawine@31
    31
			{
sawine@31
    32
				return Math.pow(c.real, 2) + Math.pow(c.imag, 2);
sawine@31
    33
			}
sawine@31
    34
			
sawine@31
    35
			function complex_add(c1, c2)
sawine@31
    36
			{
sawine@31
    37
				return new Complex(c1.real + c2.real, c1.imag + c2.imag);
sawine@31
    38
			}
sawine@31
    39
			
sawine@31
    40
    		function iterate(z, c) 
sawine@31
    41
    		{
sawine@31
    42
    			z_quad = complex_quad(z);
sawine@31
    43
				return new Complex(z_quad.real + c.real, z_quad.imag + c.imag);
sawine@31
    44
    		}
sawine@31
    45
    		
sawine@31
    46
    		function test(c, max_iter) 
sawine@31
    47
    		{
sawine@31
    48
    			var iter = 0;
sawine@31
    49
    			var z = new Complex(0.0, 0.0);
sawine@31
    50
				while (complex_quad_value(z) <= 4.0
sawine@31
    51
					&& iter < max_iter)
sawine@31
    52
				{
sawine@31
    53
					z = iterate(z, c);
sawine@31
    54
					iter++;
sawine@31
    55
				}
sawine@31
    56
				return new Result(z, iter);
sawine@31
    57
    		}
sawine@31
    58
sawine@31
    59
    		function draw(iter, x, y, z)
sawine@31
    60
    		{  
sawine@31
    61
        		var canvas = document.getElementById('mandelbrot');  
sawine@31
    62
        		if (canvas.getContext)
sawine@31
    63
        		{  
sawine@31
    64
          			var ctx = canvas.getContext('2d');           			
sawine@31
    65
          			z = z / 10.0;
sawine@31
    66
          			zoom += z;
sawine@31
    67
          			if (zoom < 1)
sawine@31
    68
          				zoom = 1;
sawine@31
    69
          			x = x / 10.0 / zoom;
sawine@31
    70
          			y = y / 10.0 / zoom;
sawine@31
    71
          			var min_inc = new Complex(x + z, y + z);
sawine@31
    72
          			var max_inc = new Complex(x - z, y - z);
sawine@31
    73
          			min_c = complex_add(min_c, min_inc);
sawine@31
    74
          			max_c = complex_add(max_c, max_inc);
sawine@31
    75
          			max_iter += iter;
sawine@31
    76
          			var diff_c = new Complex(max_c.real - min_c.real,
sawine@31
    77
          				max_c.imag - min_c.imag);
sawine@31
    78
          			var width = canvas.width;
sawine@31
    79
          			var height = canvas.height;
sawine@31
    80
          			var dim = Math.max(width, height);
sawine@31
    81
          			ctx.clearRect(0, 0, width, height);
sawine@31
    82
          			
sawine@31
    83
          			for (var y = 0; y < height; y++) 
sawine@31
    84
          			{
sawine@31
    85
          				for (var x = 0; x < width; x++) 
sawine@31
    86
          				{        					
sawine@31
    87
          					if (true) 
sawine@31
    88
          					{
sawine@31
    89
          						var c = new Complex(min_c.real + diff_c.real 
sawine@31
    90
          							/ dim * x, 
sawine@31
    91
          							min_c.imag + diff_c.imag / dim * y);  	
sawine@31
    92
          					 	var result = test(c, max_iter);
sawine@31
    93
          					 	
sawine@31
    94
          					 	if (result.iter < max_iter) 
sawine@31
    95
          					 	{
sawine@31
    96
          					 		var r = result.iter * 3;
sawine@31
    97
          					 		var g = result.iter * 3;
sawine@31
    98
          					 		var b = result.iter * 3; 
sawine@31
    99
          					 		var colour = r + "," + g + "," + b;
sawine@31
   100
          					 		ctx.fillStyle = "rgb(" + colour + ")"; 
sawine@31
   101
          							ctx.fillRect(x, y, 1, 1);
sawine@31
   102
          						}
sawine@31
   103
          					}  
sawine@31
   104
						}
sawine@31
   105
			  		}
sawine@31
   106
        		}  
sawine@31
   107
      		}  
sawine@31
   108
    	</script>  
sawine@31
   109
    	<style type="text/css">  
sawine@31
   110
      		canvas { border: 0px solid black; }  
sawine@31
   111
      		body { background: black; }
sawine@31
   112
    	</style>  
sawine@31
   113
  	</head>  
sawine@31
   114
  	<body onload="draw(0, 0, 0, 0);">  
sawine@31
   115
    	<canvas id="mandelbrot" width="800" height="400"></canvas> 
sawine@31
   116
    	<p>
sawine@31
   117
<button onclick="draw(0, -1, 0, 0);">Left</button>
sawine@31
   118
<button onclick="draw(0, 1, 0, 0);">Right</button>
sawine@31
   119
<button onclick="draw(0, 0, -1, 0)">Up</button>
sawine@31
   120
<button onclick="draw(0, 0, 1, 0);">Down</button>
sawine@31
   121
<button onclick="draw(0, 0, 0, 1);">In</button>
sawine@31
   122
<button onclick="draw(0, 0, 0, -1);">Out</button>
sawine@31
   123
<button onclick="draw(10, 0, 0, 0);">Inc Quality</button>
sawine@31
   124
<button onclick="draw(-10, 0, 0, 0);">Dec Quality</button>
sawine@31
   125
		</p> 
sawine@31
   126
		
sawine@31
   127
  	</body>  
sawine@31
   128
</html>
sawine@31
   129
sawine@31
   130