JSFiddle - React, Tailwind, and code Playground
HTML
<canvas id="c" height="640" width="640"></canvas>
JavaScript
var intervalTime = 40;
var balls = 8;
var maxstep = 64;
var canvas = $('#c').get(0);
var ctx = canvas.getContext('2d');
var step = 0;
animateWorld = function() {
createBase();
step = step % maxstep;
var centerX = canvas.width/2 + 115 * Math.cos(step * 2 / maxstep * Math.PI);
var centerY = canvas.height/2 + 115 * Math.sin(step * 2 / maxstep * Math.PI);
for (var i=0; i<balls; i++) {
drawCircle(ctx, (centerX + 115 * Math.cos((i * 2 / balls - step * 2 / maxstep) * Math.PI)), (centerY + 115 * Math.sin((i * 2 / balls - step * 2 / maxstep) * Math.PI)), 10, '#FFFFFF');
}
step++;
}
function createBase() {
drawCircle(ctx, canvas.width/2, canvas.height/2, 240, '#000000');
for(var i=0; i<balls*2; i++) {
drawLine(ctx, canvas.width/2, canvas.height/2, canvas.width/2 + 240 * Math.cos(i / balls * Math.PI), canvas.height/2 + 240 * Math.sin(i / balls * Math.PI), '#FFFFFF');
}
}
function drawLine(context, x1, y1, x2, y2, c) {
context.beginPath();
context.moveTo(x1,y1);
context.lineTo(x2,y2);
context.lineWidth = 3;
context.strokeStyle = c;
context.stroke();
}
function drawCircle(context, x, y, r, c) {
context.beginPath();
context.arc(x, y, r, 0, 2*Math.PI);
context.fillStyle = c;
context.fill();
}
function drawRect(context, x, y, w, h, c) {
context.fillStyle = c;
context.fillRect(x, y, w, h);
}
$(document).ready(function() {
intervalID = window.setInterval(animateWorld, intervalTime);
});