Mesmerizing dots
I saw on Reddit a post titled Mesmerizing and it was just a gif with some coloured dots in motion in a particular pattern.
It was quite intriguing and I found myself staring at the thing for more than I am willing to admit.
So, it was almost midnight, I am thinking, I can probably do this in a cople of hours… right? Right? Sure, it would be a fun experiment in Javascript. And there goes my sleep…
Update: note quite finished, but I think I going in the right direction. Very little code: a loop that runs 18 times, creates the dots and animation, while the index rotates the layer that the dot is animating on by 20. I need to get the timing of the individual dots right and perhaps also the changing of colors.
Notice how all the dots just move up and down a static line. 18 dots, 18 lines angled at 20 degrees from eachother. I added a toggle button so you can see how the magic suddenly disappears when you see the lines.
dots.js - (code in progress...)
var stageWidth = 480;
var stageHeight = 320;
var stage;
var mainImage = new Image();
var radian = new Kinetic.Layer();
function init() {
stage = new Kinetic.Stage({
container: 'experimentcontainer',
width: stageWidth,
height: stageHeight
});
for (var i = 1; i <= 18; i++) {
window.animateDot(new Kinetic.Circle({
radius: 5,
fill: '#' + (Math.random() * 0xFFFFFF << 0).toString(16),
stroke: 'black',
strokeWidth: 1,
offset: [0, 0]
}), new Kinetic.Layer(), i);
};
mainImage.onload = function () {
var image = new Kinetic.Image({
x: 0,
y: 0,
image: mainImage,
width: 480,
height: 320
});
window.radian.add(image);
stage.add(window.radian);
window.radian.hide();
};
mainImage.src = "/private/experiments/mesmerizing/images/main_18.png";
}
function animateDot(dot, layer, index) {
var amplitude = 120;
var period = 2000;
var centerX = stage.getWidth() / 2;
var centerY = stage.getHeight() / 2;
layer.move(centerX, centerY);
layer.rotateDeg((20 * index));
new Kinetic.Animation(function(frame) {
dot.setX(
amplitude * Math.sin(
(frame.time + (amplitude/2 * index)) * Math.PI/period) + centerY/2
);
}, layer.add(dot)).start();
stage.add(layer);
}
function toggle() {
if (window.radian.attrs.visible) {
window.radian.hide();
} else {
window.radian.show();
}
}
jQuery(function ($) {
init();
});


