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...