Source for demo by lintaba.
var L=I=0,N=T=.1,a,b=(A=
document.getElementById("c")).getContext("2d"),w=A.width/2,h=A.height/2,M=Math,n=M.PI/180,C=M.cos,S=M.sin,u=document.addEventListener,
r=function(){A.width=w=window.innerWidth;A.height=h=window.innerHeight;h=h/2;w=w/2;},
R=function(){b.fillStyle="#FFF";b.fillRect(0,0,w*2,h*2);q=b.createRadialGradient(w,h,0,w,h,125);a="addColorStop";q[a](0,'#EEE');q[a](.99,'#666');q[a](1,'transparent');b.fillStyle=q;b.fillRect(0,0,w*2,h*2);for(a=0;a<20;a++){S(a+L*n)<0?g(w,h,250,C(a+L*n)*250,0):0;C(a+I*n)<0?g(w,h,S(a+I*n)*250,250,1):0;}L-=T*5;I-=N*5;setTimeout(R,50);}
r();R();A.style.position="fixed";
function Y(a){b.moveTo(a[0],a[1]);b.bezierCurveTo(a[0],(a[1]+a[3])/2,(a[2]+a[0])/2,a[3],a[2],a[3]);}
function g(l,t,e,f,m){l-=e/2;t-=f/2;b.beginPath();m?(Y([l+e,t+f/2,l+e/2,t+f]),Y([l+e,t+f/2,l+e/2,t])):(Y([l,t+f/2,l+e/2,t]),Y([l+e,t+f/2,l+e/2,t]));b.stroke();}
u("mousemove",function(e){e.target==A?(N=e.clientX/w/2-.5,T=e.clientY/h/2-.5):0},!0);
u("resize",r,!0);