(function(){
var alg = function(n){ var base=2*n; return [ [base+1, base*n + base, base*n + base+1], [2*base + 4, 2*base*n + 4*base + 3, 2*base*n + 4*base + 5] ]; } var sym=function(a,b,c){ return [ [[a,b,c],[-a,b,c],[-a, -b, c], [a, -b, c]],[[b,a,c],[-b,a,c],[-b, -a, c], [b, -a, c]] ]; } var symList=function(abc){ return sym(abc[0], abc[1], abc[2]); } var symMatrix=function(abcABC){ return [symList(abcABC[0]), symList(abcABC[1])]; } var abc = function(a, b, c){ //122, 212, 223; neg b when T1, neg a when T3... return [[[ -a + 2*b + 2*c, -2*a + b + 2*c, -2*a + 2*b + 3*c ],[ a + 2*b + 2*c, 2*a + b + 2*c, 2*a + 2*b + 3*c ],[ a - 2*b + 2*c, 2*a - b + 2*c, 2*a - 2*b + 3*c ]], [[ 2*a + b - c, -2*a + 2*b + 2*c, -2*a + b + 3*c ],[ 2*a + b + c, 2*a - 2*b + 2*c, 2*a - b + 3*c ],[ 2*a - b + c, 2*a + 2*b + 2*c, 2*a + b + 3*c ]]]; } var gen = function(root){ var clone= [[[ abc(root[0][0][0][0], root[0][0][0][1], root[0][0][0][2]), abc(root[0][0][1][0], root[0][0][1][1], root[0][0][1][2]), abc(root[0][0][2][0], root[0][0][2][1], root[0][0][2][2]), abc(root[0][0][3][0], root[0][0][3][1], root[0][0][3][2]) ], [ abc(root[0][1][0][0], root[0][1][0][1], root[0][1][0][2]), abc(root[0][1][1][0], root[0][1][1][1], root[0][1][1][2]), abc(root[0][1][2][0], root[0][1][2][1], root[0][1][2][2]), abc(root[0][1][3][0], root[0][1][3][1], root[0][1][3][2]) ]], [[ abc(root[1][0][0][0], root[1][0][0][1], root[1][0][0][2]), abc(root[1][0][1][0], root[1][0][1][1], root[1][0][1][2]), abc(root[1][0][2][0], root[1][0][2][1], root[1][0][2][2]), abc(root[1][0][3][0], root[1][0][3][1], root[1][0][3][2]) ], [ abc(root[1][1][0][0], root[1][1][0][1], root[1][1][0][2]), abc(root[1][1][1][0], root[1][1][1][1], root[1][1][1][2]), abc(root[1][1][2][0], root[1][1][2][1], root[1][1][2][2]), abc(root[1][1][3][0], root[1][1][3][1], root[1][1][3][2]) ]]]; clone.path = function(odd,ab, quadrant, prime, turn, side){ console.log(clone[odd][ab][quadrant][prime][turn][side]); } return clone; } var time = function(i){ var private = symMatrix(alg(i)); var public = gen(private); return { private : private, public: public } } var space = function(context, time){ context.beginPath(); context.moveTo(time.private[0][0][0], time.private[0][0][1]); var odd = [].concat(time.public); var counter = 0, atom=[]; while(odd.length){ var ab = [].concat(odd.shift()); while(ab.length){ var quadrant = [].concat(ab.shift()); while(quadrant.length){ var prime = [].concat(quadrant.shift()); var abc = [].concat(time.private[odd.length][ab.length][quadrant.length]); atom.push( { odd: odd.length, ab: ab.length, quadrant: quadrant.length, a: abc[0], b: abc[1], c: abc[2], xy: function(x, y){ return [x+this.a, y+this.b, this.c]; } }); while(prime.length){ var turn = [].concat(prime.shift()); while(turn.length){ abc = [].concat(turn.shift()); atom.push( { odd: odd.length, ab: ab.length, quadrant: quadrant.length, time: prime.length, turn: turn.length, a: abc[0], b: abc[1], c: abc[2], xy: function(x, y){ return [x+this.a, y+this.b, this.c]; } }); } } } } } return atom; } var canvas = document.createElement("canvas"); var origin = [window.innerWidth/2, window.innerHeight/2]; canvas.width = window.innerWidth; canvas.height=window.innerHeight; var context = canvas.getContext("2d"); var pointEvent = document.createEvent("Event"), collisionPoint = document.createEvent("Event"); pointEvent.initEvent("point", true, true), collisionPoint.initEvent("collision"); var history = [[],[]]; var spawn = []; var collision = function(index, point){ history[1][index].push(point); spawn.push(function(){console.log('tick');tick(point, point.x, point.y)}); } var pixel = function(point){ history[0].push(point.id), history[1].push([point]); context.rect(point.x, point.y, 1, 1); context.stroke(); } var atomic = function(event){ event.point.id = event.point.x + "," + event.point.y; var index = history[0].indexOf(event.point.id); (index>-1) ? collision(index, event.point) : pixel(event.point); } var tick = function(local, x, y){ var spot = local.xy(x, y); local.x = spot[0]; local.y = spot[1]; pointEvent.point = local; document.dispatchEvent(pointEvent); } document.addEventListener("point", atomic, true); window.addEventListener("load", function(event){ document.body.appendChild(canvas); var root = 0; var less = root-10, more = root+10, data, atom, matrix=[]; while(less<more){ data = time(less); matrix.push(space(context, data)); less++; } document.addEventListener("mouseup", function(event){ var exwall = [].concat(matrix), wall, x=event.clientX, y=event.clientY; console.log(event); while(exwall.length){ wall = [].concat(exwall.shift()); while(wall.length){ tick(wall.shift(), x, y); } } var thread = window.setInterval(function(){ if(spawn.length){ console.log("go"); while(spawn.length){ spawn.shift()(); } } else { console.log("stop"); window.clearInterval(thread); } }, 30); }, true); }); })();
Comments