Matrix Rotation v2.0

by goldfingerxyz

HTML

<!-- Notes: * http://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array * http://stackoverflow.com/questions/15170942/how-to-rotate-a-matrix-in-an-array-in-javascript -->

CSS

#trace p {
    font-family:"Courier New", monospace;
    font-size: 11px;
    white-space: pre;
}

JavaScript

Number.prototype.mod = function (n) {
    return ((this % n) + n) % n;
}

var trace = function (message) {
    id = 'trace';
    t = $('#' + id);
    if (t.length < 1) t = $('<div>', {
        'id': id
    }).appendTo($('body'));
    t.append($('<p>', {
        'html': message
    }));
};

var trace2 = function (label, message) {
    trace('<strong>' + label + ':</strong><br /><br />' + message);
};

var pad = function (val, amt, ch) {
    ch = typeof ch !== 'undefined' ? ch : ' ';
    var str = val
    var max = Math.abs(amt);
    while (str.length < max) {
        if (amt < 0) {
            str += ch;
        } else {
            str = ch + str;
        }
    }
    return str;
};

var printMatrix = function (matrix) {
    var str = '';
    for (var r = 0; r < matrix.length; r++) {
        for (var c = 0; c < matrix[r].length; c++) {
            var cell = matrix[r][c];
            if (cell != 'undefined') {
                str += pad(cell, 2);
            } else {
                str += '?';
            }
            if (c < matrix[r].length - 1) {
                str += ' |';
            }
        }
        if (r < matrix.length - 1) {
            str += '\n';
            for (var i = 0; i < matrix[r].length; i++) {
                str += '---'
                if (i < matrix[r].length - 1) {
                    str += '+';
                }
            }
            str += '\n';
        }
    }
    return str;
};

var arrayFilled = function (width, height, value) {
    for (var a = []; a.length < height;) {
        for (var r = []; r.length < width;) {
            r.push(value);
        }
        a.push(r);
    }
    return a;
};

var rotateMatrix = function (matrix, direction) {
    direction = direction.mod(360) || 0;

    var deepCopy = function (obj) {
        if (Object.prototype.toString.call(obj) === '[object Array]') {
            var out = [],
                i = 0,
                len = obj.length;
            for (; i < len; i++) {
               ...