JS1K

#2: the original

Source for demo by Matt Hobbs.

_=document;t=_.getElementById("c");c=t.getContext("2d");y=this;t.width=w=y.innerWidth;t.height=h=y.innerHeight;M=Math;G=M.PI*2;f=false;P=[];X=[];S=[];Y=[];D=[];Z=[];C=[];r="#c39";g="#6c6";b="#6ff";e="#000";_.body.style.background=e;R=M.random;q=w/4;l=h/4;for(i=50;i--;){X[i]=R()*w;P[i]=R()*w;S[i]=2+R()*5;Y[i]=2+R()*5;R()*2<1?D[i]=1:D[i]=-1;R()*2<1?Z[i]=1:Z[i]=-1;C[i]=9+R()*5}
setInterval(function(){c.fillStyle=e;c.fillRect(0,0,w,h);for(i=50;i--;){if(X[i]>w||X[i]<0)D[i]*=-1;if(P[i]>h||P[i]<0)Z[i]*=-1;c.save();c.beginPath();c.arc(X[i],P[i],C[i],0,G,f);c.clip();A=[q,l,q,l,r,3*q,l,3*q,l,g,w/2,3*l,w/2,3*l,b];for(n=3;n--;){K=n*5;c.globalAlpha=0.3;O=c.createRadialGradient(A[K],A[K+1],99,A[K+2],A[K+3],w/3);O.addColorStop(0,A[K+4]);O.addColorStop(1,e);c.fillStyle=O;c.fillRect(0,0,w,h)}c.restore();X[i]+=D[i]*S[i];P[i]+=Z[i]*Y[i]}B=[r,q,l,g,3*q,l,b,w/2,3*l];for(v=3;v--;){J=v*3;c.fillStyle=
B[J];c.beginPath();c.arc(B[J+1],B[J+2],20,0,G,f);c.fill()}},10);