let s={a:400,b:.8,c:1,d:4,e:20,f:.5,g:60,h:.02,i:.05,j:2,k:1,l:.2,m:'#000000',n:2},c=[],p,S=[],C=1,K=['#db2f96','#ff9193','#f6cb45','#5fcd8c','#60b1f4','#aa0707','#fff','#cb6e14','#050505','#2331b1'];function setup(){createCanvas(windowWidth,windowHeight);C=min(width,height)/800;K=[K[floor(random(10))],K[floor(random(10))]];p=T();I();G()}function windowResized(){resizeCanvas(windowWidth,windowHeight);C=min(width,height)/800;p=T();I();G()}function draw(){background(s.m);A()}function T(){let t=0,n=4000,p=null;for(let i=0;i<=n;i++){let o=i/n,r=P(o);p&&(t+=dist(p.x,p.y,r.x,r.y));p=r}return t}function I(){const d=[[400,400,400,447.34375,361.625,488.71875,314.28125,488.71875],[314.28125,488.71875,266.9375,488.71875,228.5625,447.34375,228.5625,400],[228.5625,400,228.5625,314.28125],[228.5625,314.28125,314.28125,314.28125],[314.28125,314.28125,361.625,314.28125,400,352.65625,400,400],[400,400,400,447.34375,438.375,488.71875,488.71875,488.71875],[488.71875,488.71875,533.0625,488.71875,571.4375,447.34375,571.4375,400],[571.4375,400,571.4375,352.65625,533.0625,314.28125,488.71875,314.28125],[488.71875,314.28125,438.375,314.28125,400,352.65625,400,400]],t=[0,0,1,1,0,0,0,0,0];let l=0,L=[],n=1000;for(let i=0;i<9;i++){let x=0,p=null;for(let o=0;o<=n;o++){let s=o/n,e=t[i]?lerp(d[i][0]*C,d[i][2]*C,s):bezierPoint(d[i][0]*C,d[i][1]*C,d[i][2]*C,d[i][3]*C,s),r=t[i]?lerp(d[i][1]*C,d[i][3]*C,s):bezierPoint(d[i][4]*C,d[i][5]*C,d[i][6]*C,d[i][7]*C,s),a={x:e,y:r};p&&(x+=dist(p.x,p.y,a.x,a.y));p=a}L.push(x);l+=x}S=[];let s=0;for(let i=0;i<9;i++)S.push({s:s,e:s+=L[i]/l,i})}function P(t){let e=S.find(s=>t>=s.s&&t<=s.e);if(!e)return{x:400*C,y:400*C};let s=(t-e.s)/(e.e-e.s),a=e.i,b=C*400,c=C*488.71875,x=C*314.28125,y=C*228.5625,z=C*571.4375;switch(a){case 0:return{x:bezierPoint(b,b,C*361.625,x,s),y:bezierPoint(b,C*447.34375,c,c,s)};case 1:return{x:bezierPoint(x,C*266.9375,y,y,s),y:bezierPoint(c,c,C*447.34375,b,s)};case 2:return{x:lerp(y,y,s),y:lerp(b,x,s)};case 3:return{x:lerp(y,x,s),y:lerp(x,x,s)};case 4:return{x:bezierPoint(x,C*361.625,b,b,s),y:bezierPoint(x,x,C*352.65625,b,s)};case 5:return{x:bezierPoint(b,b,C*438.375,C*488.71875,s),y:bezierPoint(b,C*447.34375,c,c,s)};case 6:return{x:bezierPoint(C*488.71875,C*488.71875,z,z,s),y:bezierPoint(c,c,C*447.34375,b,s)};case 7:return{x:bezierPoint(z,z,C*533.0625,C*488.71875,s),y:bezierPoint(b,C*352.65625,x,x,s)};case 8:return{x:bezierPoint(C*488.71875,C*438.375,b,b,s),y:bezierPoint(x,x,C*352.65625,b,s)}};}function N(t){let p=P(t),e=(t+.001)%1,n=P(e),x=n.x-p.x,y=n.y-p.y,l=sqrt(x*x+y*y);return{x:p.x,y:p.y,nX:l>0?-y/l:0,nY:l>0?x/l:0}}function O(m,r){if(r==0)return 0;if(r==1)return random()<.5?-m:m;return r==.5?(random()-.5)*2*m:r<.5?(r/.5)*((random()-.5)*2*m):((r-.5)/.5)*(random()<.5?-m:m)+(1-(r-.5)/.5)*((random()-.5)*2*m)}function E(r,d){return r==0||r==1?d*.5:r<=.5?(.5+(r/.5)*(1-.5))*d:(1-((r-.5)/.5)*(1-.5))*d}function G(){c=[];let v=1/s.a,e=20,d=E(s.f,s.d*C);for(let i=0;i<s.a;i++){let u=constrain(i*v+(random()-.5)*.02,0,1),o=N(u),a=random()<(s.f<.5?s.h:s.i),m=a?s.g*C:s.e*C,n=O(m,s.f),x=o.x+n*o.nX,y=o.y+n*o.nY,l=abs(n),r=a?s.k*C:s.j*C,w=max(s.l*C,r-(l/m)*(r-s.l*C));if(x>=0&&x<=width&&y>=0&&y<=height)c.push({t:u,o:n,r:w,x,y,m})}for(let i=0;i<c.length;i++){let a=0;while(a<e){let t=false;for(let o=0;o<c.length;o++){if(i===o)continue;let p=c[i],l=c[o],x=p.x-l.x,y=p.y-l.y,m=sqrt(x*x+y*y),r=p.r+l.r+d;if(m<r){t=true;let e=N(p.t);p.t=(p.t+(random()-.5)*(r-m+d)/p+1)%1;p.o+=((random()-.5)*(r-m+d/2));p.o=constrain(p.o,-p.m,p.m);let a=abs(p.o);r=(a>s.e*C)?s.k*C:s.j*C;p.r=max(s.l*C,r-(a/p.m)*(r-s.l*C));let w=N(p.t);p.x=w.x+p.o*w.nX;p.y=w.y+p.o*w.nY}}if(!t)break;a++}}c.sort((a,b)=>a.t-b.t);let f=c.slice();for(let q=0;q<1;q+=.1){let e=q,a=q+.1,i=f.filter(c=>c.t>=e&&c.t<a),n=max(0,5-i.length);for(let j=0;j<n;j++){let u=random(e,a),o=N(u),r=random()<(s.f<.5?s.h:s.i),m=r?s.g*C:s.e*C,w=O(m,s.f),x=o.x+w*o.nX,y=o.y+w*o.nY,l=abs(w),v=r?s.k*C:s.j*C,h=max(s.l*C,v-(l/m)*(v-s.l*C));if(x>=0&&x<=width&&y>=0&&y<=height)f.push({'t':u,o:w,r:h,x,y,m})}}let l=0,m=s.a*.1;f.sort((a,b)=>a.t-b.t);for(let i=f.length-1;i>=0;i--){let w=f[i],r=false;for(let o=0;o<f.length;o++){if(i===o)continue;let c=f[o],x=w.x-c.x,y=w.y-c.y,a=sqrt(x*x+y*y),n=w.r+c.r+d;if(a<n){if(l>=m){let e=N(w.t);w.t=(w.t+(random()-.5)*(n+d)/p+1)%1;let r=N(w.t);w.x=r.x+w.o*r.nX;w.y=r.y+w.o*r.nY}else if(w.r<c.r||(w.r===c.r&&i>o)){r=true;l++;break}}}if(r)f.splice(i,1)}c=f.sort((a,b)=>a.t-b.t)}function A(){let t=s.b/s.c;for(let i=0;i<c.length;i++){let e=c[i],a=(i*s.b)/(c.length-1||1),d=((frameCount/60-a)+t)%t,o=floor((d/t)*s.n),l=(o+1)%s.n,r=(d/t*s.n)%1;fill(lerpColor(color(K[o]),color(K[l]),r));noStroke();circle(e.x,e.y,e.r*4)}}
↓ show full (4,654 bytes)