let par = 0, tm = 0, cancel = 1,
gap = 15, siz = 30, mode = 0, col = [40, 60, 80], glow = 1;
rect(0, 0, width, height);
(Math.random()*7)%(Math.PI)+Math.PI/2, (Math.random()*7)%(Math.PI)+Math.PI/2
pendulums.push(new pend(r, [0, 0]));
pendulums.push(new pend([r[0], r[1]+0.3], [0, 0]));
push(); scale(width/400);
noFill(); stroke(...col); strokeWeight(3);
curveVertex(200 + Math.sin(pendulums[0].p[0])*rad + Math.sin(pendulums[0].p[1])*rad,
200 + Math.cos(pendulums[0].p[0])*rad + Math.cos(pendulums[0].p[1])*rad);
curveVertex(200 + Math.sin(p.p[0])*rad + Math.sin(p.p[1])*rad,
200 + Math.cos(p.p[0])*rad + Math.cos(p.p[1])*rad);
let x = pendulums.length-1;
curveVertex(200 + Math.sin(pendulums[x].p[0])*rad + Math.sin(pendulums[x].p[1])*rad,
200 + Math.cos(pendulums[x].p[0])*rad + Math.cos(pendulums[x].p[1])*rad);
rect(-400, -400, 1200, 1200);
rect(-400, -400, 1200, 1200);
for(let p of pendulums) p.update();
for(let i=1; i<pendulums.length; ++i){
Math.sin(pendulums[i].p[0])*rad + Math.sin(pendulums[i].p[1])*rad -
Math.sin(pendulums[i-1].p[0])*rad - Math.sin(pendulums[i-1].p[1])*rad,
Math.cos(pendulums[i].p[0])*rad + Math.cos(pendulums[i].p[1])*rad -
Math.cos(pendulums[i-1].p[0])*rad - Math.cos(pendulums[i-1].p[1])*rad
let d = dp[0]*dp[0] + dp[1]*dp[1];
pendulums.splice(i, 0, new pend([
(pendulums[i].p[0]+pendulums[i-1].p[0])/2,
(pendulums[i].p[1]+pendulums[i-1].p[1])/2
(pendulums[i].v[0]+pendulums[i-1].v[0])/2,
(pendulums[i].v[1]+pendulums[i-1].v[1])/2
for(let i=siz; i<pendulums.length; ++i){
if(par % 3) pendulums.pop();
noFill(); stroke(255); strokeWeight(1);
curveVertex(200 + Math.sin(pendulums[0].p[0])*rad + Math.sin(pendulums[0].p[1])*rad,
200 + Math.cos(pendulums[0].p[0])*rad + Math.cos(pendulums[0].p[1])*rad);
curveVertex(200 + Math.sin(p.p[0])*rad + Math.sin(p.p[1])*rad,
200 + Math.cos(p.p[0])*rad + Math.cos(p.p[1])*rad);
let x = pendulums.length-1;
curveVertex(200 + Math.sin(pendulums[x].p[0])*rad + Math.sin(pendulums[x].p[1])*rad,
200 + Math.cos(pendulums[x].p[0])*rad + Math.cos(pendulums[x].p[1])*rad);
for(let i=1; i<pendulums.length; ++i){
stroke(...col, 255*Math.pow(Math.sin(i*Math.PI/pendulums.length), 0.6));
line(200 + Math.sin(pendulums[i-1].p[0])*rad + Math.sin(pendulums[i-1].p[1])*rad,
200 + Math.cos(pendulums[i-1].p[0])*rad + Math.cos(pendulums[i-1].p[1])*rad,
200 + Math.sin(pendulums[i].p[0])*rad + Math.sin(pendulums[i].p[1])*rad,
200 + Math.cos(pendulums[i].p[0])*rad + Math.cos(pendulums[i].p[1])*rad);
for(let i=1; i<pendulums.length; ++i){
stroke(255, 255*Math.pow(Math.sin(i*Math.PI/pendulums.length), 0.8));
line(200 + Math.sin(pendulums[i-1].p[0])*rad + Math.sin(pendulums[i-1].p[1])*rad,
200 + Math.cos(pendulums[i-1].p[0])*rad + Math.cos(pendulums[i-1].p[1])*rad,
200 + Math.sin(pendulums[i].p[0])*rad + Math.sin(pendulums[i].p[1])*rad,
200 + Math.cos(pendulums[i].p[0])*rad + Math.cos(pendulums[i].p[1])*rad);
if(Date.now() > tm + 300){
siz = 100; gap = 30; col = [40, 80, 40];
siz = 500; gap = 6; col = [80, 60, 40];
siz = 30; gap = 15; col = [40, 60, 80];
if(Date.now() < last + 300){
rect(0, 0, width, height);
if(mouseX > 0 && mouseX < width && mouseY > 0 && mouseY < height) swap();
function touchStarted(e){
resizeCanvas(Math.min(windowWidth-15, windowHeight-15), Math.min(windowWidth-15, windowHeight-15));
rect(0, 0, width, height);
if(e instanceof TouchEvent)
for(let r of e.changedTouches)
for(let t of touches) if(t.id == r.identifier)
if(t.x > 0 && t.x < width && t.y > 0 && t.y < height)
if(!ignore && touches.length == 1) swap();