relaxation CA

HTML

<canvas id=c width=200 height=200></canvas>
<!--pre id=pre_stat></pre-->
<canvas id=c_stat width=300 height=100></canvas>

CSS

canvas {
    box-shadow:0 0 10px;
}
#c {
    width: 500px;
}

JavaScript

var c = document.getElementById("c")
var ctx = c.getContext("2d")
var h = c.height
var w = c.width
var id = ctx.createImageData(w, h)

var c_stat = document.getElementById("c_stat")
var ctx_stat = c_stat.getContext("2d")
var h_stat = c_stat.height
var w_stat = c_stat.width
var id_stat = ctx_stat.createImageData(w_stat, h_stat)

var t = 0
var statEl = document.getElementById("pre_stat")

var FORCE = 1/8;
var FRAME_SKIP = 2;
var STAT_SPEED = 1;

function normalize(x) {
    var scale = 2 / (x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + 1);
    x[0] *= scale;
    x[1] *= scale;
    x[2] *= scale
}

var model = Array(w);
var newmodel = Array(w);
for (var i = 0; i < w; i++) {
    model[i] = Array(h);
    newmodel[i] = Array(h);
    for (var j = 0; j < h; j++) {
        model[i][j] = [(2 * Math.random() - 1) * 1,
                       (2 * Math.random() - 1) * 0, 
                       (2 * Math.random() - 1) * 0];
        newmodel[i][j] = [0, 0, 0];
    }
}

stat_window = Array(w_stat / STAT_SPEED);
stat_min = undefined;
stat_max = undefined;
function render_stat(model, ctx, id) {
    //statEl.textContent = JSON.stringify(model, true);
    var drop = stat_window.shift();
    stat_window.push(model.forceSS);
    if(model.forceSS > stat_max) stat_max = model.forceSS;
    if(model.forceSS < stat_min) stat_min = model.forceSS;
    if(drop == stat_min || drop == stat_max || stat_min == 1/0){
        stat_min =  1/0;
        stat_max = -1/0;
        for(var i=0; i<stat_window.length; i++){
            if(stat_min > stat_window[i]){
                stat_min = stat_window[i]
            }
            if(stat_max < stat_window[i]){
                stat_max = stat_window[i]
            } 
        }
    }//end recompute extrema
    v_scale = h_stat / (stat_min - stat_max);
    ctx.clearRect(0, 0, w_stat, h_stat);
    ctx.beginPath();
    ctx.moveTo(0, (stat_window[0] - stat_max) * v_scale);
    debugger;
    for(var i=0; i<stat_window.length; i++){
        ctx.lineTo(i *...