You can interact by clicking and moving your mouse. Work best in Chrome.
a.style.cursor='none';X=Y=G=(H=a.height)/2;d=r=(M=Math).PI/2;R=M.random;(g=(z=a.cloneNode()).getContext('2d')).translate(Q=o=(W=a.width)/4,e=u=n=0);A=[0];B=[];for(t=i=3e3;i--;l=A.push(B[i]=i%2?(R()*2|0)*W-o:R()*(W+o)-o));C=A.slice();function F(){U=u%2;requestAnimationFrame(F);for(i=Q?U?1:3:U?n+1:9;i--;(Q=n?n<t?Q:0:(u=0,1))?A[++n]=(A[n-2]||0)+M[n%2?'sin':'cos'](n%6?d:d+=n&-n&n/2?r:-r)*7:A[--n]=C[n]);Q?(q=e,e=g[s='fillStyle']='#'+(100+R()*900|0)):0;n%5?0:(g.save(),g.rotate(r/2),Q?0:g[s]='#fff',g[f](-W,n%2?0:-W,W*3,W),g.restore());for(i=l;N=i--;(g[f='fillRect'](x=B[i],y=B[N],7,7),g.strokeRect(x,y,7,7)))g[s]=i%2?q:(B[i]+=((U&Q?R()*H-G:u%4?A[i]|0:A[N]|0)+(i>n?0:X-B[i]))/(j=Q?M.pow(i,.3):i)||0,B[N]+=((U&Q?R()*H-G:u%4?A[N]|0:A[i]|0)+(i>n?0:Y-B[N]))/j||0,e);c.drawImage(z,0,0);}onmousemove=function(e){X=e.pageX-o;Y=e.pageY};onclick=function(){++u};F();
YS5zdHlsZS5jdXJzb3I9J25vbmUnO1g9WT1HPShIPWEuaGVpZ2h0KS8yO2Q9cj0oTT1NYXRoKS5QSS8yO1I9TS5yYW5kb207KGc9KHo9YS5jbG9uZU5vZGUoKSkuZ2V0Q29udGV4dCgnMmQnKSkudHJhbnNsYXRlKFE9bz0oVz1hLndpZHRoKS80LGU9dT1uPTApO0E9WzBdO0I9W107Zm9yKHQ9aT0zZTM7aS0tO2w9QS5wdXNoKEJbaV09aSUyPyhSKCkqMnwwKSpXLW86UigpKihXK28pLW8pKTtDPUEuc2xpY2UoKTtmdW5jdGlvbiBGKCl7VT11JTI7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKEYpO2ZvcihpPVE/VT8xOjM6VT9uKzE6OTtpLS07KFE9bj9uPHQ/UTowOih1PTAsMSkpP0FbKytuXT0oQVtuLTJdfHwwKStNW24lMj8nc2luJzonY29zJ10obiU2P2Q6ZCs9biYtbiZuLzI/cjotcikqNzpBWy0tbl09Q1tuXSk7UT8ocT1lLGU9Z1tzPSdmaWxsU3R5bGUnXT0nIycrKDEwMCtSKCkqOTAwfDApKTowO24lNT8wOihnLnNhdmUoKSxnLnJvdGF0ZShyLzIpLFE/MDpnW3NdPScjZmZmJyxnW2ZdKC1XLG4lMj8wOi1XLFcqMyxXKSxnLnJlc3RvcmUoKSk7Zm9yKGk9bDtOPWktLTsoZ1tmPSdmaWxsUmVjdCddKHg9QltpXSx5PUJbTl0sNyw3KSxnLnN0cm9rZVJlY3QoeCx5LDcsNykpKWdbc109aSUyP3E6KEJbaV0rPSgoVSZRP1IoKSpILUc6dSU0P0FbaV18MDpBW05dfDApKyhpPm4/MDpYLUJbaV0pKS8oaj1RP00ucG93KGksLjMpOmkpfHwwLEJbTl0rPSgoVSZRP1IoKSpILUc6dSU0P0FbTl18MDpBW2ldfDApKyhpPm4/MDpZLUJbTl0pKS9qfHwwLGUpO2MuZHJhd0ltYWdlKHosMCwwKTt9b25tb3VzZW1vdmU9ZnVuY3Rpb24oZSl7WD1lLnBhZ2VYLW87WT1lLnBhZ2VZfTtvbmNsaWNrPWZ1bmN0aW9uKCl7Kyt1fTtGKCk7
a.style.cursor='none';
X=Y=G=(H=a.height)/2;
d=r=(M=Math).PI/2;R=M.random;
(g=(z=a.cloneNode()).getContext('2d')).translate(Q=o=(W=a.width)/4,e=u=n=0);
A=[0];B=[];
for(t=i=3e3;i--;l=A.push(B[i]=i%2?(R()*2|0)*W-o:R()*(W+o)-o));
C=A.slice();
function F()
{
U=u%2;
requestAnimationFrame(F);
for(i=Q?U?1:3:U?n+1:9;i--;(Q=n?n<t?Q:0:(u=0,1))?A[++n]=(A[n-2]||0)+M[n%2?'sin':'cos'](n%6?d:d+=n&-n&n/2?r:-r)*7:A[--n]=C[n]);
Q?(q=e,e=g[s='fillStyle']='#'+(100+R()*900|0)):0;
n%5?0:(g.save(),g.rotate(r/2),Q?0:g[s]='#fff',g[f](-W,n%2?0:-W,W*3,W),g.restore());
for(i=l;N=i--;(g[f='fillRect'](x=B[i],y=B[N],7,7),g.strokeRect(x,y,7,7)))
g[s]=i%2?q:(B[i]+=((U&Q?R()*H-G:u%4?A[i]|0:A[N]|0)+(i>n?0:X-B[i]))/(j=Q?M.pow(i,.3):i)||0,B[N]+=((U&Q?R()*H-G:u%4?A[N]|0:A[i]|0)+(i>n?0:Y-B[N]))/j||0,e);
c.drawImage(z,0,0);
}
onmousemove=function(e){X=e.pageX-o;Y=e.pageY};
onclick=function(){++u};
F();