memoscan
← all memos

Memo 0x1ee51f16…9a263c on Ethereum

let seed="",A_R=1.25,D_S=1600,DIM=Math.min(window.innerWidth,window.innerHeight/A_R),S=DIM/D_S;function presetup(){canvas=createCanvas(1600*S,1600*A_R*S),setupUseful()}function keyPressed(){"s"===key&&save("pattern"),"d"===key&&generateEmbroiderySVG(5.5/A_R*10*2.5)}let P,LP,pa={},N_B=24;function setupParams(e={}){e.notreset||(rays=[]),pa.n=e.n??rnd([2,4,7,20]),pa.NC=e.NC??100;for(let t=0;t<pa.NC;t++){let t=vec(W/2,H/2);pa.NC>1&&(t=rndvec(0,W,0,H)),pa.O=e.O??rnd(TAU);for(let e=0;e<TAU;e+=TAU/pa.n){let A=new Poly([t],0,0,1,0,0);A.dir=vec(cos(e+pa.O),sin(e+pa.O)),rays.push(A)}}pa.SR=e.SR??1,pa.A=e.A??rnd([0,1,2,3,4]),pa.SM=e.SM??rnd([0,1]),pa.i=e.i??5e3,pa.B=e.B??[];let t=Poly.rect(W/2,H/2,W,H);t.S.push(t.S[0].copy()),pa.B.push(t),pa.DD=0,pa.DDS=e.DDS??1,pa.BBA=0;let A=color,r=A(121,23,44),s=A(26,46,35),n=A(142,120,82),i=A(12,22,32),l=A(34,34,35),o=A(52,54,51),a=A(247,175,41),g=A(225),w=A(240);pa.c=pa.c??rnd([{bg:g,BBL:l,BBS:l,BBF:w,LBS:l,LBF:-1,LBH:rnd([A(0),A(0),A(0),A(0),a,r,n,s]),TF:l},{bg:l,BBL:w,BBS:A(255),BBF:i,LBS:w,LBF:-1,LBH:rnd([A(255),A(255),A(255),A(255),a,s,o]),TF:g},{bg:s,BBL:r,BBS:a,BBF:r,LBS:a,LBF:-1,LBH:a,TF:a}]),pa.B=[];let p=[{s:"AToncwQgBZ+A5P89+wOf/O9wOAE6/wjgBV/weAAB/wTgDI/gIQDM/g+/+5/gjAOaAAAADgAgLgvjAQAAAe/QRvGF/Q8v/Q/gtf/N/QaP+R/QEP9E/Q5P6k/QAv6t/AlwRV/Qlwd3/AOAGMAgjgBWAAxgA4AAhwgbAQbgNIAAcgAqAAOADGAAOAHwBQjgAIBATwAZBAIgDgAwAADgAwwP9wAgqf+KAQj/+sAQTPSW4wtAtqHA7//qOg5PwAAA8v843AYwEDAAnf79/wBQCZ9AWQECAAp/7+/wCAB99AVgEBAAqv7//wAQCs/g//9UAQyv0BAANgL//w+P+DCw0v0CAALgL+/w+/9nCw1/0DAAKQL9/wDgDIIwHAMAAA/v/cCA4/+pAAj/9xAAue8AAAJvWP/wHQCS/A1wF50wAAyQAAx//N+Qc/R1/wxv8uBg8/rK/wVADM+Q8wQ8AA"},{y:2050,s:"t1VSiQNwA73wCwBg7AAwCQ+w1P8N/Qov9I/gov/S/gP/9w/g+v57/g+f4n/wRv4K/wAf5r/w8vhS/wdf8n+w5wUZAAYAHu/wxgHH/w8QGH/wxgFL/w7QBU/w1QD8/glgCp/gLgCv/gCADf/g1/+A/grf8j/gvP0d9wlP4g+Q+goUAgLgL0/w7wAJAAjgAjAATQAlAASgBoAAHwDFAA+QAtBgZwCGAwPQBaBAEQCfAw4v8XBAgv9lAws/8QAQkv+GAQx/TH4gOQs5HQkv+oAwaf/FPw8/+9AA3P8wAAyv8VAAcv8KAA5fXq/w"},{s:"iBV1Bwpg6Z+A6ATKCQYAR5BwoQLfAw1wM7BQKQVsBgJQYTBwqv+yAAuP8QAQBgBRAQPQBpAQnwAGAgKwF/AwogCDAgbADKAg/v/gAQu/+pAQZv97AQE/9hAQ3P4YAQoP7QAAvv5wAAu/45AA5v4CAAMv7Z/wg/2W/wqf/f/wkf92/wgP1r/Abv02/Avfqp9wo/xB+gs/la9A+fwp+g2fdz7w"},{s:"TAkeDAwvbhBwSgcrCAXAGeAQnwO+BAmwNRBQMAMXBQDgNKBQ0wGYAwbAOABg6QD6/g2wBK/wQQFI/wSwFx/wogGl/wEQIDAAtQFFAADQKaAAfgHHAAFwJ0AQawQpAw8fzl+Q0f7h/QkP2k+wQ/2/+wk/w3+wHvwK+wRfmy9wc/vQ+glPr6+QivsA+w"},{s:"wQ6OSgHgTp/QZwSm/QCgM9/gEQEe/w/wCqAAZAGAAA7gFGAApwMAAAcgD4CAAABXHwAADUEQAAAwKw2eoAAAAACR/AVQFA1wqgAr7wHAB59wj/9f9QxgCq/w5P8g/Quf+u/AgP90/AZf8l/QK/9u/Q"},{s:"cUOrJQbwet/w8P8g/gBAAK/gzP8r/A9P9Y/gJACo/gFgDr/gRQC9/gBwHG/QDwBz/w3/+n/wt/+p/w/P1C/gJPu1BAsf8qAAF//5AAt//LAAy//eAA9f8tAQ+P9WAQIQDqAwOgCdBA"},{s:"NiiKXwBAEcAAUAEdAAcAHj/wcQG+/weQFg/wSwE5/wIwEW/wMQF1/gOQCiEA/gEEPQm/CNAAGwK+yQOQCV+AOABZ+wVQAj+A"},{y:2050,s:"8EztwAAAAf/QXvVX/gHQDEAghQrGAQ"},{y:2050,s:"jkUXtQAADN+Qge9W/wq/8XBg1BDGAA"},{s:"DVlOFglfjgBAOAFTAgjQCqAAegAvAA2gDf/wKgHI/wzwHV/wygEdAAqQJxAASQI4AAqgsAAAVAK6/whQKd/wEgLj/wxAE5AALAE5AAqwAAAAcQDH/wqQEf/Qefgg+wO/2pAQnv21AAEP4vAAjfcAAAwv2a/wLv5Y/wdP2B/g"},{s:"x1e7IA4wD/AQjQAcAA6QABAA+gAbAARRIAAA/wDk/w4wAAAAcQDk/w4wAB/gOv4cAAyvwAAAAf8dAARPMAAA5f7j/w5vwAAAHv7k/w"}];pa.LL=[],LP=p.map((e=>{let t=new Poly(DP(e.s),90*S,350*S,3.5*S);return t.MW(),t=new Poly(t.S,0,e.y?e.y*S:0,.9,e.r),t})),pa.LL=p.map(((e,t)=>{let A=new Poly(LP[t].S,0,0,.9);return LP[t].LS=A,A})),pa.LL.map((e=>{let t=new Poly(e.S.map((e=>vec(W-e.x,e.y))));t.MW(),e.setColor(pa.c.BBL,pa.c.bg),t.setColor(pa.c.BBL,pa.c.bg),pa.LL.push(t)}))}function placeAll(){patterns=LP;let e=[];do{print("LAYOUT ATTEMPT"),e=[],patterns=[...shuffle(patterns.slice(0,4)),...shuffle(patterns.slice(4,9)),...shuffle(patterns.slice(9))],e.push(new Poly([vec(W/2-1*S,H/2),vec(W/2,H/2)])),patterns.map(((t,A)=>{if(patterns.length-A+e.length<N_B/2)return;let r=[];e.map((e=>{r.push(...e.HCPD())}));let s=t.TWR(e,r);s&&(s.highCurvePreselected=t.highCurvePreselected,s.LS=t.LS,e.push(s))}))}while(e.length<N_B/2);pa.B=[];let t={bbr:0,bbt:H,bbb:0};e.map((e=>{let A=new Poly(e.S,0,0,.9);A.LS=e.LS,A.bbr>t.bbr&&(t.bbr=A.bbr),A.bbb>t.bbb&&(t.bbb=A.bbb),A.bbt<t.bbt&&(t.bbt=A.bbt),pa.B.push(A)}));let A=pa.B.length;for(let e=0;e<A;e++){let A=pa.B[e];A.translate(-t.bbr+W/2,-t.bbt+(t.bbt+(H-t.bbb))/2-40*S);let r=new Poly(A.S.map((e=>vec(W-e.x,e.y))));r.MW(),pa.B.push(r)}pa.B=shuffle(pa.B);let r=pa.B.filter((e=>17==e.S.length)),s=pa.B.filter((e=>28==e.S.length));r[0].LS||(r[0].LS=new Poly(r[1].LS.S.map((e=>vec(W-e.x,e.y)))),r[0].LS.MW()),s[0].LS||(s[0].LS=new Poly(s[1].LS.S.map((e=>vec(W-e.x,e.y)))),s[0].LS.MW()),pa.B.splice(pa.B.indexOf(r[1]),1),pa.B.splice(pa.B.indexOf(s[1]),1);let n="pBCQBgAAD0/Auv9g/wdP9g/wwP4k/wNP4u/wmP6m/wbP3O/wqP1aAAev6WAA6P6qAA+P3qAQyv4wAgiP/CAQ4v/mAAAADwAAKABAAQRgAEAQ0gDWAQVAGuAQVAEYAQ4AHwAAaAFkAAaAEoAAXgEAAAVAHY/wkAGS/wzAEu/wSgEa/wUACw/wRgCc/wHgCc/wAADy/gAAA+/gFAB+/wFACw/wMgCc/wPACw/wWgCw/wRvsAAAWgBGAARgBkAAMgBuAAHgCMAACgCAAg9v9uAAxP+gAAnP9uAA/P6+AABv9uAAjv5aAA3v4AAAwP66/wyv5g/w/P4G/wTP/y/gVv+Y/gfv8M/g2P+E/gHgCO/geAD4/QqgCE/gqgDe/g0gAu/wNgFC/w5gCm/w3ADi/w3AAAAAGAEoAALAFkAAGAGWAAIgHmAA0gDmAAvgDwAAtABAAQ",i="kCmAAgAAAACg2P/mAAdP8iAQQv/IAA8v6gAA3v5kAAjv48AAwP72/w1P7E/w6P6c/wTP+I/wav90/wfv9M/wpv8u/w2P8Q/w9v84/wAADm9gMgAk/wUAB+/wbgCS/wbvsAAAWgBaAAbgCqAAHgDwAAAADUCACgAsAQHgCWAAjABeAQ8AAiAQLAHSAAQAGCAAVAFaAAQAEoAAVAEAAASgHO/w+gDE/wIgGS/wGAFg/wtABq/wqgAk/wZAAu/wMgAk/wFABM/wAAAy9gCgCw/wHgCI/wMgCc/wUACm/wRgDE/wTv0AAAUABGAARgBQAAKABGAAHgBkAA",l="JEWGBgiP/8/gav8Q/wGv/e/gwP7U/ghP4u/wZv6I/wov7i/w1P4oAAov6WAAGv++AALv/6AAfv/mAAnP/mAApv8YAQxP8EAQ4v8sAQCgBKAQMgBUAQKAC+AAeABKAQ0gB8AQlgC0AAyACgAAyAB4AA5gBQAABAEoAA3AD2/wvgDi/wDgG6/w3ACm/wLAFM/wIgEk/w8AAG/wqgAa/wjADy/gPACI/wkv80Aw9v8oAAxP9uAAsP9aAAEP++AA1P6qAAmP6MAAZv5aAAcP4oAArP7s/wcP66/w8v6c/wQv+w/wyv44/wLv9M/wav9W/wJP/e/gfv/8/gnP/o/guv+O/gAACi/gHgDo/gUADU/geADU/goADo/goAAu/waAG2/gNgFC/w+gCS/w0gC6/wIgHO/wLAHi/wpAEUAADgEoAAIgFQAANgGCAANgG0AAIgHwAAUACgAACgBQAA",o="zm2KAgAAC8DAAACgAAFACMAAMgCCAAZACCAAMgAyAAjPsAAAZACc/wRgCI/wMgBq/wAABg/wAADC8g4v9+/wxP9+/wnP+S/w2P/Y/wkgQAAAkv9kAAuv9kAA4v9aAA7P9QAA";n=DP(n),i=DP(i),l=DP(l),o=DP(o),pa.G=[];let a=[n,i,l,o];a=a.map((e=>new Poly(e,0,0,.8*S))),a.map((e=>e.S.map((e=>e.add(vec(.43*W,.93*H)))))),a.push(new Poly(a[2].S,55*S)),a.map((e=>{e.setColor(pa.c.BBF,pa.c.BBS),pa.G.push(e)})),redraw()}let vec,rndvec,canvas,W,H,rnd,sn,q=[],rays=[];function setup(){presetup(),strokeWeight(2*S);P=rnd([{n:20,NC:250,A:0,i:5e3,SM:0,DDS:.05},{n:2,NC:200,A:2,i:1e4,DDS:.11},{n:2,NC:5e3,A:4,i:2e4,SM:0,DDS:.05},{n:2,NC:100,SR:1,A:0,i:3e4,DDS:.06}]),setupParams(P),background(pa.c.bg),noFill(),strokeJoin(BEVEL),textFont("Georgia");if(background(pa.c.bg),push(),noStroke(),fill(pa.c.TF),textAlign(CENTER,CENTER),textSize(20*S),text("LOADING",W/2,120*S),pop(),pa.LL.map((e=>{e.draw()})),placeAll(),!pa.RR){let e,t;for(pa.LL.map((e=>e.draw())),e=rays,t=rays.slice(0),iters=0;t.length&&iters<pa.i;){iters++;let A=t.shift(),r=[...pa.B];pa.SR&&(r=[...r,...e]);let s=A.rayIntersect(r,A.dir);if(s){A.addPoint(s.point);let e=reflect(A.dir,s,0);e&&(A.dir=e,t.push(A))}}strokeWeight(1*S),pa.RR=[],pa.SM?e.map((e=>{pa.B.reduce(((t,A)=>t+A.contains(e.S[0])),0)>0&&(e.S.splice(0,0,e.S[0].copy()),pa.RR.push(e))})):e.map(((e,t)=>{pa.B.reduce(((t,A)=>t+A.contains(e.S[0])),0)>0&&pa.RR.push(e)})),pa.RR.map((e=>{e.setColor(pa.c.LBF,pa.c.LBS),rnd()<.05&&e.setColor(pa.c.LBF,pa.c.LBH)})),print("RENDERED")}for(let e=0;e<pa.B.length;e++){let t=pa.B[e];if(t.setColor(pa.c.BBF,pa.c.BBS),!t.stitches&&e<N_B){t.stitches=[];let e=t.outline(1.1).stepnodes(10*S),A=!1;for(let r=0;r<e.length-1;r+=2){(!A&&rnd()<.008||A&&rnd()<.02)&&(A=!A);let s=e[r],n=e[r+1];if(A){let e=new Poly([s,n]);e.setColor(-1,pa.c.BBS),lin2=e.copy().reflect([0],vec(W/2,H/2),1,1),t.stitches.push(e,lin2)}}}if(!t.CP&&e<N_B&&(t.CP=t.HCPD().map((e=>e[0])).filter((()=>rnd()<.1)),t.registration=t.HCPD(0).filter(((e,t)=>!(t%8))).filter((e=>!t.contains(p5.Vector.add(e[0],e[1]))))),!t.labels){t.labels=[];for(let e=0;e<3;e++){let e=draw.toString().replace(/\s+/g,""),A=floor(rnd(e.length-10)),r=t.label(e.substring(A,A+floor(rnd(5,10))));if(!r)continue;let s=100*S;r.p.overlapsCount(pa.B)<=1&&r.p.onCanvas(s,W-s,s,H-s)&&t.labels.push(r)}}}}function draw(){if(!(frameCount<100)){randomSeed(seed),blendMode(BLEND),background(pa.c.bg),loop();for(let e=0;e<pa.B.length;e++){strokeWeight(2*S);let t=pa.B[e];if(pa.BBA<1)return pa.BBA+=.003,void pa.B.map(((e,t)=>{if(!e.LS)return;let A=1-(cos(PI*(1-pa.BBA))+1)/2,r=e.morph([[e.S[0],e.S[1]]],[[e.LS.S[0],e.LS.S[1]]],A),s=r.copy().reflect([PI/2],vec(W/2,H/2),1,1),n=lerpColor(color(pa.c.bg),color(pa.c.BBS),1-A),i=lerpColor(color(pa.c.BBL),color(pa.c.BBF),1-A);r.setColor(i,n),s.setColor(i,n),17!=e.S.length&&28!=e.S.length&&s.draw(),r.draw()}));strokeWeight(S),pa.G.map((e=>{e.draw()})),t.stitches&&t.stitches.map((e=>e.draw())),push(),strokeWeight(2*S),t.draw(),pop(),t.CP&&t.CP.map((e=>circle(e.x,e.y,10*S))),t.registration&&t.registration.map((e=>{let t=e[0],A=e[1];push(),stroke(pa.c.BBS),line(t.x,t.y,20*A.x*S+t.x,20*A.y*S+t.y),pop()})),t.labels.map((e=>{push(),textAlign(CENTER,CENTER),noStroke(),fill(pa.c.TF),textSize(W/80),e.p.setColor(-1,pa.c.LBS),e.p.draw(),text(e.text,e.pt.x,e.pt.y),pop()}))}strokeWeight(1*S),pa.DD+=pa.DDS,pa.RR.map(((e,t)=>{e.drawPercent(pa.DD,pa.SM)})),push(),erase(),Poly.rect(W/2,H/2,W-80*S,H-80*S).draw(),noErase(),pop()}}function reflect(e,t,A=0){let r=t.dir,s=r.copy(),n=r.copy().rotate(PI/2),i=e.copy().reflect(n),l=e.copy();if(abs(abs(s.angleBetween(l))-PI/2)<1e-6)return;let o=A*(p5.Vector.cross(e,r).z<0?1:-1),a=-(p5.Vector.cross(e,i).z<0?-1:1);return 2==pa.A?e.rotate(-(PI/2+.01)*a).rotate(o):3==pa.A?e.rotate(2*PI/3+.01).rotate(o):4==pa.A?e.rotate(PI-.1).rotate(o):i.rotate(o)}function setupUseful(){setupRandom(),W=width,H=height,vec=createVector,rndvec=(e=0,t=W,A=0,r=H)=>vec(rnd(e,t),rnd(A,r))}function setupRandom(){seedRNG(seed),rnd=random,sn=noise}function seedRNG(){""==seed&&(seed=str(floor(random(1e10))),txt=seed),console.log(seed);let e=0;for(let t=0;t<seed.length;t++){e=(e<<5)-e+seed.charCodeAt(t),e|=0}randomSeed(e),noiseSeed(e)}function generateEmbroiderySVG(e,t){let A=(e*=3.77953)/W,r=[...pa.B,...pa.G,...pa.RR].map((e=>e.copy())),s=8/e*W;if(r=r.map((e=>{let t=e.c??color(0),r=e.sc??color(0);return e.setColor(t,r),e.reseed(s),e.S=e.S.map((e=>vec(e.x*A,e.y*A))),e.findBBox(),e})),new Set(r.map((e=>e.sc.toString("#rrggbb")))).size>MAX_THREAD_NUMBER)throw"too many colors";return saveSVGElement(createSVGCanvas(r,e,e*A_R),`${`${`${(new Date).toLocaleDateString()} @ ${(new Date).toLocaleTimeString()}`} -- ${seed}`}.svg`).outerHTML}function saveSVGElement(e,t){e.setAttribute("xmlns","http://www.w3.org/2000/svg");var A=e.outerHTML,r=new Blob(['<?xml version="1.0" standalone="no"?>\r\n',A],{type:"image/svg+xml;charset=utf-8"}),s=URL.createObjectURL(r),n=document.createElement("a");return n.href=s,n.download=t,document.body.appendChild(n),n.click(),document.body.removeChild(n),document.body.appendChild(e),e}function createSVGCanvas(e,t,A){ns="http://www.w3.org/2000/svg",svg=document.createElementNS(ns,"svg"),groups=[],svg.setAttribute("width","100vw"),svg.setAttribute("height","100vh"),svg.setAttribute("viewBox","0 0 "+t+" "+A),pa.c.bg&&svg.setAttribute("style",`background-color:rgb(${red(pa.c.bg)/2.55}%,${green(pa.c.bg)/2.55}%,${blue(pa.c.bg)/2.55}%);`);let r={};return e.map((e=>{let A,s=e.sc.toString("#rrggbb");r.hasOwnProperty(s)?A=r[s]:(A=document.createElementNS(ns,"g"),A.setAttribute("id",s),A.setAttribute("style",`stroke-linejoin=bevel; stroke-linecap:round; fill:none; stroke-width:${t/800}; stroke:rgb(${red(e.sc)/2.55}%,${green(e.sc)/2.55}%,${blue(e.sc)/2.55}%); `),svg.appendChild(A),r[s]=A);let n=e.S;if(!n||!n.length)return;let i=document.createElementNS(ns,"path"),l=`M ${n[0].x} ${n[0].y} `;for(let e=1;e<n.length;e++)l+=`L ${n[e].x.toPrecision(6)} ${n[e].y.toPrecision(6)} `;i.setAttribute("d",l),A.appendChild(i)})),svg}p5.disableFriendlyErrors=!0,MAX_THREAD_NUMBER=12;class Vec{constructor(e,t){this.x=e,this.y=t}add(e){return new Vec(this.x+e.x,this.y+e.y)}sub(e){return new Vec(this.x-e.x,this.y-e.y)}mult(e){return new Vec(this.x*e,this.y*e)}div(e){return new Vec(this.x/e,this.y/e)}dot(e){return this.x*e.x+this.y*e.y}len(){return dist(0,0,this.x,this.y)}norm(){return this.div(this.len())}perp(){return new Vec(this.y,-this.x)}}class Poly{constructor(e,t=0,A=0,r=1,s=0,n=!0,i=undefined,l=undefined){this.S=e.map((e=>{let n=e.copy();return n.rotate(s),vec(t+n.x*r,A+n.y*r)}));let o=this.S[this.S.length-1];!n||this.S[0].x==o.x&&this.S[0].y==o.y||this.S.push(this.S[0].copy()),this.closed=0,this.inactive=[],this.inactive.length=this.S.length,this.findBBox(),this.tex=null,this.c=i,this.sc=l}MW(e=1){return(e&&this.getArea()<0||!e&&this.getArea()>0)&&(this.S=this.S.reverse()),this.findBBox(),this}morph(e,t,A=1,r=!1){if(r){let A=[],r=[];for(let s=0;s<e.length;s+=2)A.push([e[s],e[s+1]]),r.push([t[s],t[s+1]]);e=A,t=r}let s=[];for(let r=0;r<e.length;r++){let n=p5.Vector.lerp(e[r][0],t[r][0],A),i=p5.Vector.lerp(e[r][1],t[r][1],A);s.push([n,i])}let n=((e,t,A)=>{if(t.length!=A.length)throw"correspondences dont align";let r=[];for(let s=0;s<e.length;s++){let n=new Vec(0,0),i=0,l=new Vec(e[s].x,e[s].y);for(let e=0;e<t.length;e++){let r=new Vec(t[e][0].x,t[e][0].y),s=new Vec(t[e][1].x,t[e][1].y),o=new Vec(A[e][0].x,A[e][0].y),a=new Vec(A[e][1].x,A[e][1].y);const g=l.sub(r).dot(s.sub(r))/s.sub(r).len()**2,w=l.sub(r).dot(s.sub(r).perp())/s.sub(r).len(),p=o.add(a.sub(o).mult(g)).add(a.sub(o).perp().mult(w).div(a.sub(o).len())).sub(l);let h;h=g<0?l.sub(r).len():g<1?Math.abs(w):l.sub(s).len();const c=(o.sub(a).len()**.5/(.01+h))**2;n=n.add(p.mult(c)),i+=c}const o=l.add(n.div(i));r.push(vec(o.x,o.y))}return r})(this.S,e,s);return new Poly(n)}outline(e){let t=new Poly(this.S,0,0,e),A=this.centerOfMass(),r=t.centerOfMass();return t.translate(A.x-r.x,A.y-r.y),t}label(e){let t=vec(rnd(this.bbl,this.bbr),rnd(this.bbt,this.bbb));if(!this.contains(t))return;let A=this.centerOfMass(),r=p5.Vector.sub(t,A).heading(),s=round(r/(PI/2))*(PI/2);s+=rnd([PI/2,0,-PI/2]);let n=rnd(W/8,W/4),i=vec(1,0).rotate(s).setMag(n),l=p5.Vector.add(t,i);return this.contains(l)?void 0:{p:new Poly([t,l]),text:e,pt:p5.Vector.add(t,i.copy().setMag(n+30*S))}}TWR(e,t,A=.2){t=shuffle(t);let r=this.HCPD();r=shuffle(r);for(let[s,n]of r)for(let[r,i]of t){let t=rnd(TAU);for(let l=t;l<TAU+t;l+=A){let t=new Poly(this.S,-s.x,-s.y);if(t.rotate(l,vec(0,0)),n.setMag(1),t.translate(-n.x,-n.y),t.translate(r.x+i.x,r.y+i.y),!t.overlapsAny([...e,Poly.rect(3*W/4,H/2,W/2,H)],1,1)){let e=new Poly(this.S,-s.x,-s.y);return e.rotate(l,vec(0,0)),n.setMag(1),e.translate(-n.x,-n.y),e.translate(r.x+i.x,r.y+i.y),e}}}}HCPD(e=.5){let t=[];for(let A=0;A<this.S.length-1;A++){let r=(A+1)%this.S.length,s=(A+2)%this.S.length,n=this.S[A],i=this.S[r],l=this.S[s],o=p5.Vector.sub(i,n),a=p5.Vector.sub(l,i),g=o.copy().normalize(),w=a.copy().normalize(),p=p5.Vector.add(g,w);if(p.rotate(-PI/2),p.normalize(),abs(o.angleBetween(a))>e){if(this.highCurvePreselected&&!this.highCurvePreselected.includes(A))continue;t.push([i,p])}}return t}translate(e,t){return this.S=this.S.map((A=>vec(A.x+e,A.y+t))),this.findBBox(),this}rotate(e,t=undefined){return t=t??this.centerOfMass(),this.S=this.S.map((A=>{let r=p5.Vector.sub(A,t);return r.rotate(e),vec(r.x,r.y)})),this.findBBox(),this}static rect(e,t,A,r){let s=1e-6,n=[vec(e-(A/=2),t-(r/=2)),vec(e+A,t-r),vec(e+A+s,t+r),vec(e-A-s,t+r)];return new Poly(n)}addPoint(e){this.S.push(e),this.findBBox()}rayIntersect(e,t,A=1){let r=this.S[this.S.length-1],s=p5.Vector.add(r,t),n=[];if(e.map((e=>{for(let t=0;t<e.S.length-1;t++){let A=e.S[t],i=e.S[(t+1)%e.S.length],l=this.rayToLineSegmentIntersection(r,s,A,i);l&&n.push(l)}})),n.sort(((e,t)=>e.t-t.t)),n.length&&n[0].t>A)return n[0]}rayToLineSegmentIntersection(e,t,A,r){let s=t.x-e.x,n=t.y-e.y,i=r.x-A.x,l=r.y-A.y,o=l*s-i*n,a=i*(e.y-A.y)-l*(e.x-A.x),g=s*(e.y-A.y)-n*(e.x-A.x);if(0==o)return void 0;let w=a/o,p=g/o,h=1e-6;return w>=h&&p>=h&&p<=1-h?{point:createVector(e.x+w*s,e.y+w*n),t:w,dir:p5.Vector.sub(r,A)}:void 0}stepnodes(e=10,t=undefined){if(t>e)throw"r > gap";this.reseed(e),t&&(t*=t);let A=[],r=0;for(let s=0;s<this.S.length;s++){let n=(s+1)%this.S.length,i=this.S[s],l=this.S[n],o=p5.Vector.dist(i,l),a=(e-r)/o;if(a>1){r+=o;continue}let g=p5.Vector.lerp(i,l,a);t&&A.reduce(((e,A)=>e||p5.Vector.sub(A,g).magSq()<t),!1)||(A.push(g),r=(1-a)*o)}return A}reflect(e,t=undefined,A=!1,r=!1){t=t??this.centerOfMass();let s=this.S;for(let n=0;n<e.length;n++){let i,l=e[n],o=[],a=vec(1,0).rotate(l);if(a.setMag(39e3),r)o=s;else for(let e=0;e<s.length;e++){let A=s[e];p5.Vector.sub(A,t).cross(a).z>0?o.push(A):i=i??e}a.rotate(PI/2),o=o.concat(o.splice(0,i));let g=o.length;for(let e=g-1;e>=0;e--){let A=vec(o[e].x,o[e].y);A.sub(t);let r=A.reflect(a);r.add(t),o.push(r)}s=o,A&&s.splice(0,g)}return this.S=s,this.MW(),this.findBBox(),this}copy(e=undefined,t=undefined,A=1,r=undefined,s=undefined){return e=e??0,t=t??0,A=A??1,r=r??this.c,s=s??this.sc,new Poly(this.S,e,t,A,0,this.closed,r,s)}setColor(e=undefined,t=undefined){return this.c=e,this.sc=t,this}onCanvas(e=0,t=width,A=0,r=height){return this.bbl>e&&this.bbr<t&&this.bbt>A&&this.bbb<r}static intersect(e,t,A,r){let s=(e,t,A)=>{let r=p5.Vector.sub(e,t),s=p5.Vector.sub(A,t);return r.angleBetween(s)<0};if(s(e,t,A)!=s(e,t,r)){return s(A,r,e)!=s(A,r,t)}return!1}findBBox(){this.bbl=999999,this.bbr=-999999,this.bbt=999999,this.bbb=-999999;for(let e of this.S)e.x<this.bbl&&(this.bbl=e.x),e.x>this.bbr&&(this.bbr=e.x),e.y<this.bbt&&(this.bbt=e.y),e.y>this.bbb&&(this.bbb=e.y)}BBoxOverlap(e){return this.bbr>e.bbl&&this.bbb>e.bbt&&this.bbr>e.bbl&&this.bbt<e.bbb&&this.bbl<e.bbr&&this.bbb>e.bbt&&this.bbl<e.bbr&&this.bbt<e.bbb}getArea(){let e=this.S;for(var t=0,A=0,r=e.length;A<r;A++){t+=e[A].x*e[A==e.length-1?0:A+1].y*.5,t-=e[A==e.length-1?0:A+1].x*e[A].y*.5}return t}getPerimeter(e=!0){if(!e&&this.perimeter)return this.perimeter;{let e=this.S.reduce(((e,t,A)=>{let r=(A+1)%this.S.length;return e+p5.Vector.sub(t,this.S[r]).mag()}),0);return this.perimeter=e,this.perimeter}}contains(e){if(e.x<this.bbl||e.x>this.bbr||e.y<this.bbt||e.y>this.bbb)return!1;let t=vec(999999,e.y),A=0;return this.S.map(((r,s)=>{let n=(s+1)%this.S.length;A+=Poly.intersect(e,t,this.S[s],this.S[n])})),!(A%2==0)}overlaps(e,t=!1){if(!this.BBoxOverlap(e))return!1;let A=this.S;for(let t=0;t<A.length;t++){let r=(t+1)%A.length;for(let s=0;s<e.S.length;s++){let n=(s+1)%e.S.length;if(Poly.intersect(A[t],A[r],e.S[s],e.S[n]))return!0}}return!!t&&(e.contains(A[0])||this.contains(e.S[0]))}overlapsAny(e,t=!0,A=!1){if(t&&!this.onCanvas())return!0;for(let t of e)if(this.overlaps(t,A))return!0}overlapsCount(e,t=!1){let A=0;for(let r of e)this.overlaps(r,t)&&A++;return A}reseed(e=5){let t=[];for(let A=0;A<this.S.length-!this.closed;A++){let r=(A+1)%this.S.length,s=this.S[A],n=this.S[r],i=e/p5.Vector.dist(s,n);if(t.push(s),i<1)if(i>.5)t.push(p5.Vector.lerp(s,n,.5));else for(let e=i;e<1;e+=i)t.push(p5.Vector.lerp(s,n,e))}return t.push(this.S[this.S.length-1].copy()),this.S=t,this}centerOfMass(){return p5.Vector.div(this.S.reduce(((e,t)=>(e.add(t),e)),vec(0,0)),this.S.length)}drawPercent(e,t=!1){let A=Math.sqrt(this.getPerimeter(!1))*e;this.drawDistance(A,t)}drawDistance(e=1e3,t=!1){null!=this.c&&(-1==this.c?noFill():fill(this.c)),null!=this.sc&&(-1==this.sc?noStroke():stroke(this.sc));let A=!1,r=0;beginShape(),this.S.map(((s,n)=>{if(A)return;if(t?curveVertex(s.x,s.y):vertex(s.x,s.y),n>=this.S.length-1)return;let i=this.S[n+1],l=p5.Vector.dist(s,i);if(r+l>e){let n=p5.Vector.lerp(s,i,constrain((e-r)/l,0,1));t?(curveVertex(n.x,n.y),curveVertex(n.x,n.y)):vertex(n.x,n.y),A=!0}r+=l})),endShape()}draw(e=!0,t=!1,A=!1){return push(),null!=this.c&&(-1==this.c?noFill():fill(this.c)),null!=this.sc&&(-1==this.sc?noStroke():stroke(this.sc)),e&&(beginShape(),this.S.map(((e,t)=>{this.inactive[t]?(endShape(),beginShape()):A?curveVertex(e.x,e.y):vertex(e.x,e.y)})),endShape()),pop(),this}}function EP(e){let t=0,A=0,r="";for(let s of e){let e=Math.round((s.x-t)*Math.pow(10,2)),n=Math.round((s.y-A)*Math.pow(10,2)),i=new ArrayBuffer(4);new DataView(i).setInt16(0,e,!0),new DataView(i).setInt16(2,n,!0),r+=btoa(String.fromCharCode(...new Uint8Array(i))),t=s.x,A=s.y}encodednoequals="";for(let e=6;e<r.length;e+=8)encodednoequals+=r.substring(e-6,e);return r=encodednoequals,r}function DP(e){encodedequals="";for(let t=6;t<e.length;t+=6)encodedequals+=e.substring(t-6,t),encodedequals+="==";e=encodedequals;let t=[],A=0,r=0;for(let s=0;s<e.length;s+=8){let n=Uint8Array.from(atob(e.substring(s,s+8)),(e=>e.charCodeAt(0))).buffer,i=new DataView(n).getInt16(0,!0),l=new DataView(n).getInt16(2,!0);i=i/Math.pow(10,2)+A,l=l/Math.pow(10,2)+r,t.push(vec(i,l)),A=i,r=l}return t}