Mandelbrot Average Colorings
Coloring a Mandelbrot using some branching average colorings.
HTML
<canvas id="pal" width="500" height="30"></canvas><br/>
<canvas id="img" width="500" height="500"></canvas><br/>
<div id="tilesLeft">.</div>
CSS
body { font-family:monospace; }
canvas { border:solid 4px black; }
JavaScript
function clamp(n) {
n *= 255;
if( n < 0 ) return 0;
if( n > 255 ) return 255;
return Math.floor(n);
}
function toPix(c) {
return {r:clamp(c.r), g:clamp(c.g), b:clamp(c.b)};
}
function drawPal(canvas) {
var ctx = canvas.getContext('2d');
var dat = ctx.getImageData(0, 0, canvas.width, canvas.height);
for(var x = 0; x < canvas.width; x++) {
var t = x/canvas.width;
var c = getPal(t);
var p = toPix(c);
for(var y = 0; y < canvas.height; y++) {
var offset = 4*(y*canvas.width + x);
dat.data[offset + 0] = p.r;
dat.data[offset + 1] = p.g;
dat.data[offset + 2] = p.b;
dat.data[offset + 3] = 255;
}
}
ctx.putImageData(dat, 0, 0);
}
function computeOrbit(c) {
orbit[0].re = 0;
orbit[0].im = 0;
orbit.escaped = false;
orbit.numPoints = 1;
var er = escapeRadius*escapeRadius;
for(var i = 1; i < maxIters; i++) {
var zp = orbit[i - 1];
var zn = orbit[i];
//z[i] = z[i - 1]^2 + c
zn.re = zp.re*zp.re - zp.im*zp.im + c.re;
zn.im = zp.re*zp.im + zp.im*zp.re + c.im;
orbit.numPoints++;
var mr = zn.re*zn.re + zn.im*zn.im;
if( mr > er ) {
orbit.escaped = true;
break;
}
}
}
function mag(z) {
var s = z.re*z.re + z.im*z.im;
if( s != 0 ) {
s = Math.sqrt(s);
}
return s;
}
//sets global var avgSum
function triangleInEq(orbit, numPoints, c) {
avgSum.s1 = 0;
avgSum.s2 = 0;
if( numPoints < 3 ) {
return 0;
}
var mc = mag(c);
for(var i = 2; i < numPoints; i++) {
var zp = orbit[i - 1];
var zc = orbit[i];
//tc = zp^2
tc.re = zp.re*zp.re - zp.im*zp.im;
tc.im = zp.re*zp.im + zp.im*zp.re;
var mp = mag(tc);
var m...