/** * Module dependencies. */ var Canvas = require('../lib/canvas') , canvas = new Canvas(243 * 4, 243) , ctx = canvas.getContext('2d') , fs = require('fs'); function render(level){ ctx.fillStyle = getPointColour(122,122); ctx.fillRect(0,0,240,240); renderLevel(level,81,0); } function renderLevel(minimumLevel,level,y){ for (var x=0; x < 243 / level; ++x) { drawBlock(x,y,level); } for (var x=0; x < 243 / level; x+=3){ drawBlock(x,y+1,level); drawBlock(x+2,y+1,level); } for (var x=0; x < 243 / level; ++x){ drawBlock(x,y+2,level); } if ((y += 3) >= 243 / level){ y=0; level /= 3; } if (level >= minimumLevel){ renderLevel(minimumLevel, level, y); } } function drawBlock(x,y,level){ ctx.fillStyle = getPointColour( x * level + (level-1) / 2 , y * level + (level-1) / 2); ctx.fillRect( x * level , y * level , level , level ); } function getPointColour(x,y){ x= x / 121.5 - 1; y= -y / 121.5 + 1; var x2y2 = x * x + y * y; if (x2y2 > 1){ return '#000'; } else { var root = Math.sqrt(1 - x2y2); var x3d = x * 0.7071067812 + root / 2 - y / 2; var y3d = x * 0.7071067812 - root / 2 + y / 2; var z3d = 0.7071067812 * root + 0.7071067812 * y; var brightness= -x / 2 + root * 0.7071067812 + y / 2; if (brightness < 0) brightness = 0; return '' + 'rgb(' + Math.round(brightness * 127.5 * (1 - y3d)) + ',' + Math.round(brightness * 127.5 * (x3d + 1)) + ',' + Math.round(brightness * 127.5 * (z3d + 1)) + ')' ; } } var start = new Date; render(10); ctx.translate(243,0); render(6); ctx.translate(243,0); render(3); ctx.translate(243,0); render(1); console.log('Rendered in %s seconds', (new Date - start) / 1000); canvas.toBuffer(function(err, buf){ if (err) throw err; fs.writeFile(__dirname + '/ray.png', buf); });