Fractals
<!DOCTYPE html>
<html>
<head><title>Fractal0</title></head>
<body onload="drawFractal()">
<canvas id="myCanvas" width="500" height="500" style="border:5px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>
<script>
var canvas=document.getElementById("myCanvas");
var context=canvas.getContext("2d");
var MAX_MAGNITUDE = 4;
var MAX_ITERATIONS = 1000;
var xmax = document.getElementById("myCanvas").width;
var ymax = document.getElementById("myCanvas").height;
var rgba = context.getImageData(0, 0, xmax, ymax);
var realStart = -2.5;
var realEnd = 1.5;
var imaginaryStart = -2.0;
var imaginaryEnd = 2.0;
//============= Fractal Functions =============
function drawPixel (x, y, r, g, b, a)
{
var index = (x + y * xmax) * 4;
rgba.data[index + 0] = r;
rgba.data[index + 1] = g;
rgba.data[index + 2] = b;
rgba.data[index + 3] = a;
}
function updateCanvas() {
context.putImageData(rgba, 0, 0);
}
function iterate(c)
{
var constant = c;
var comp = c;
for (loop = 1; loop <= MAX_ITERATIONS; loop++)
{
comp = multiply(comp, comp); // Mandelbrot Set
comp = add(comp, constant);
if ( magnitude(comp) > MAX_MAGNITUDE )
{
return loop;
}
}
return 0;
}
function drawFractal()
{
var real = realStart;
var imaginary = imaginaryStart;
for (xPix = 0; xPix < xmax; xPix++)
{
updateCanvas();
for (yPix = 1; yPix < ymax; yPix++)
{
var reps = iterate( complex(real, imaginary) );
if ( reps == 0 )
{
drawPixel(xPix, yPix, 0, 0, 0, 255);
}
else
{
drawPixel(xPix, yPix, reps * 5 % 256, reps * reps % 256, reps * 35 % 256, 255);
}
imaginary = imaginaryEnd - ( (imaginaryEnd - imaginaryStart) / ymax) * yPix;
}
real = ( (realEnd - realStart) / xmax) * xPix + realStart;
}
}
//============= Complex Functions =============
function magnitude(c)
{
return c.real * c.real + c.imaginary * c.imaginary;
}
function complex(r, i)
{
return {
real: r,
imaginary: i
};
}
function multiply(c1, c2)
{
return {
real: c1.real * c2.real - c1.imaginary * c2.imaginary,
imaginary: c1.real * c2.imaginary + c1.imaginary * c2.real
};
}
function add(c1, c2)
{
return {
real: c1.real + c2.real,
imaginary: c1.imaginary + c2.imaginary
};
}
setState(); // initialize display
drawFractal(); // draw initial fractal
</script>
</body>
</html>