- Author:
- Michael Deal
- Twitter:
- @
- GitHub:
- Facebook:
- Google+:
- +
- Reddit:
- /r/
- Pouet:
- Website:
- mudcu.be
- Compo:
- classic
- Demo link:
- https://js1k.com/2010-first/demo/166
- Shortlink:
- https://js1k.com/166
- Blog post:
- please update here!
- Bytes:
- 1016
- Chars:
- 1016
- Submission
window.onload=function(){Q=Math.random;C=Math.cos;S=Math.sin;U=0;w=window;d=document.getElementById("c");c=d.getContext("2d");W=d.width=w.innerWidth;H=d.height=w.innerHeight;c.fillRect(0,0,W,H);c.globalCompositeOperation="lighter";c.lineWidth=0.2;var a=false,e=Q()*99,f=Q()*99,g=Q()*99,b=0;d.onmousemove=function(l){if(window.T){n=5;while(n--){go(1)}clearTimeout(T)}X=l.pageX;Y=l.pageY;var k,j,h=X,m=Y;e=(l.pageX/W*1000>>0)/1000;f=(l.pageY/H*1000>>0)/1000;U=l.pageX/H*360>>0;g=25;T=setInterval(go=function(o){c.save();c.globalCompositeOperation="source-over";if(!o){c.fillStyle="rgba(0,0,0,0.015)";c.fillRect(0,0,W,H)}c.restore();i=25;while(i--){if(g>400||a){if(!a){e+=0.05;a=true}if(g<0.1){e+=0.05;a=false}g-=0.1}if(!a){g+=0.1}q=(e/f-1)*b;x=(e-f)*C(b)+g*C(q)+(h+(X-h)*(i/30))+(f-e);y=(e-f)*S(b)-g*S(q)+(m+(Y-m)*(i/30));if(k){c.moveTo(k,j);c.lineTo(x,y)}c.strokeStyle="hsl("+(U%360)+",100%,50%)";c.stroke();c.beginPath();b+=360*Math.PI/180*2;k=x;j=y}U-=0.5;h=X;m=Y},20);go()};d.onmousemove({pageX:410,pageY:207.5})};
- Description
- Creates a visualization of "galaxies" that expands and contracts as it follows the mouse coords.
- Base64 encoded
d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe1E9TWF0aC5yYW5kb207Qz1NYXRoLmNvcztTPU1hdGguc2luO1U9MDt3PXdpbmRvdztkPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjIik7Yz1kLmdldENvbnRleHQoIjJkIik7Vz1kLndpZHRoPXcuaW5uZXJXaWR0aDtIPWQuaGVpZ2h0PXcuaW5uZXJIZWlnaHQ7Yy5maWxsUmVjdCgwLDAsVyxIKTtjLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ibGlnaHRlciI7Yy5saW5lV2lkdGg9MC4yO3ZhciBhPWZhbHNlLGU9USgpKjk5LGY9USgpKjk5LGc9USgpKjk5LGI9MDtkLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKGwpe2lmKHdpbmRvdy5UKXtuPTU7d2hpbGUobi0tKXtnbygxKX1jbGVhclRpbWVvdXQoVCl9WD1sLnBhZ2VYO1k9bC5wYWdlWTt2YXIgayxqLGg9WCxtPVk7ZT0obC5wYWdlWC9XKjEwMDA+PjApLzEwMDA7Zj0obC5wYWdlWS9IKjEwMDA+PjApLzEwMDA7VT1sLnBhZ2VYL0gqMzYwPj4wO2c9MjU7VD1zZXRJbnRlcnZhbChnbz1mdW5jdGlvbihvKXtjLnNhdmUoKTtjLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbj0ic291cmNlLW92ZXIiO2lmKCFvKXtjLmZpbGxTdHlsZT0icmdiYSgwLDAsMCwwLjAxNSkiO2MuZmlsbFJlY3QoMCwwLFcsSCl9Yy5yZXN0b3JlKCk7aT0yNTt3aGlsZShpLS0pe2lmKGc+NDAwfHxhKXtpZighYSl7ZSs9MC4wNTthPXRydWV9aWYoZzwwLjEpe2UrPTAuMDU7YT1mYWxzZX1nLT0wLjF9aWYoIWEpe2crPTAuMX1xPShlL2YtMSkqYjt4PShlLWYpKkMoYikrZypDKHEpKyhoKyhYLWgpKihpLzMwKSkrKGYtZSk7eT0oZS1mKSpTKGIpLWcqUyhxKSsobSsoWS1tKSooaS8zMCkpO2lmKGspe2MubW92ZVRvKGssaik7Yy5saW5lVG8oeCx5KX1jLnN0cm9rZVN0eWxlPSJoc2woIisoVSUzNjApKyIsMTAwJSw1MCUpIjtjLnN0cm9rZSgpO2MuYmVnaW5QYXRoKCk7Yis9MzYwKk1hdGguUEkvMTgwKjI7az14O2o9eX1VLT0wLjU7aD1YO209WX0sMjApO2dvKCl9O2Qub25tb3VzZW1vdmUoe3BhZ2VYOjQxMCxwYWdlWToyMDcuNX0pfTs=
- Original source
window.onload = function () {
Q = Math.random; // cache Math objects
C = Math.cos;
S = Math.sin;
U = 0;
w = window;
d = document.getElementById("c");
c = d.getContext("2d");
W = d.width = w.innerWidth;
H = d.height = w.innerHeight;
c.fillRect(0, 0, W, H); // resize <canvas> and draw black rect (default)
c.globalCompositeOperation = "lighter"; // switch to additive color application
c.lineWidth = 0.2;
var bool = false,
R = Q() * 99, // rolling circle radius
r = Q() * 99, // fixed circle radius
D = Q() * 99, // distance
t = 0; // theta
d.onmousemove = function (e) {
if(window.T) {
n = 5; while(n--) go(1);
clearTimeout(T);
}
X = e.pageX; // grab mouse pixel coords
Y = e.pageY;
var a, // previous coord.x
b, // previous coord.y
A = X, // original coord.x
B = Y; // original coord.y
R=(e.pageX/W * 1000>>0)/1000;
r=(e.pageY/H * 1000>>0)/1000;
U=e.pageX/H * 360 >>0;
D=25;
T = setInterval(go = function (boo) { // start looping spectrum
c.save();
c.globalCompositeOperation = "source-over"; // switch to additive color application
if(!boo) {
c.fillStyle = "rgba(0,0,0,0.015)";
c.fillRect(0, 0, W, H); // resize <canvas> and draw black rect (default)
}
c.restore();
i = 25; while(i --) {
if(D > 400 || bool) { // decrease diameter
if(!bool) { // has hit maximum
R += 0.05;
bool = true;
}
if(D < 0.1) { // has hit minimum
R += 0.05;
bool = false;
}
D -= 0.1;
}
if(!bool) { // increase diameter
D += 0.1;
}
q = (R / r - 1) * t; // create hypotrochoid from current mouse position, and setup variables (see: http://en.wikipedia.org/wiki/Hypotrochoid)
x = (R - r) * C(t) + D * C(q) + (A + (X - A) * (i / 30)) + (r - R); // center on xy coords
y = (R - r) * S(t) - D * S(q) + (B + (Y - B) * (i / 30));
if (a) { // draw once two points are set
c.moveTo(a, b);
c.lineTo(x, y)
}
c.strokeStyle = "hsl(" + (U % 360) + ",100%,50%)"; // draw rainbow hypotrochoid
c.stroke();
c.beginPath();
t += 360 * Math.PI / 180 * 2; // increment theta
a = x; // set previous coord.x
b = y; // set previous coord.y
}
U -= 0.5; // increment hue
A = X; // set original coord.x
B = Y; // set original coord.y
}, 20);
go();
}
d.onmousemove({pageX:410, pageY:207.5})
}