0x18b75119…b783sent to0x381233d5…7acd·#19,667,724·view on Etherscan
[1 ,()=>{console.log("Artist 58. Luke Shannon -- platform 1 ");
p5.disableFriendlyErrors=!0;
let ptmargin,paths,pts,flip,A_R=16/9,D_S=900,DIM=Math.min(window.innerWidth,window.innerHeight/A_R),SZ=DIM/D_S,pxDensity=4,seed="";function presetup(){canvas=createCanvas(DIM,DIM*A_R),setupUseful(),pixelDensity(pxDensity),print("Thank you to p5"),print("and Bright Moments"),print("and many others!")} setup=()=>{presetup();let t=[],e=rnd(7,7);for(let i=0;i<e;i++){let e=.2;ptmargin=60*SZ;let i=new Poly(Poly.personpoints(),rnd(W*e,W*(1-e))-ptmargin,rnd(H*e,H*(1-e))-ptmargin,rnd(200,500)*SZ,PI,1);i.distort(100*SZ,500*SZ,rnd(1e3)),t.push(i)}pts=poissonSample(0,0,width-2*ptmargin,height-2*ptmargin,((e,i)=>{let s=sdfPolys(t,vec(e,i))*SZ;return Math.pow(s,.4)}),trueMinR=2*SZ,k=20),print(SZ);paths=generatePathsWithinPercent(pts,20,.00625,.025*1.75,W,H),flip=rnd()<.1};mousePressed=()=>{mouseX>0&&mouseX<width&&mouseY>0&&mouseY<height&&(flip=!flip)};draw=()=>{background(255),translate(ptmargin,ptmargin),paths=extendPaths(paths,1),fill(0),stroke(0),strokeWeight(SZ),flip?globalQuadTree.query({x:0,y:0,width:width,height:height}).forEach((t=>{circle(t.x,t.y,SZ)})):paths.forEach((t=>{t.forEach((t=>{circle(t.x,t.y,SZ)}))}))};class Quadtree{constructor(t,e){this.boundary=t,this.capacity=e,this.points=[],this.divided=!1}contains(t){return!!this.inBoundary(t)&&(!!this.points.some((e=>e.x===t.x&&e.y===t.y))||!!this.divided&&(this.northeast.contains(t)||this.northwest.contains(t)||this.southeast.contains(t)||this.southwest.contains(t)))}insert(t){return!!this.inBoundary(t)&&(this.points.length<this.capacity?(this.points.push(t),!0):(this.divided||this.subdivide(),this.northeast.insert(t)||this.northwest.insert(t)||this.southeast.insert(t)||this.southwest.insert(t)))}inBoundary(t){return t.x>=this.boundary.x&&t.x<=this.boundary.x+this.boundary.width&&t.y>=this.boundary.y&&t.y<=this.boundary.y+this.boundary.height}subdivide(){const{x:t,y:e,width:i,height:s}=this.boundary;this.northeast=new Quadtree({x:t+i/2,y:e,width:i/2,height:s/2},this.capacity),this.northwest=new Quadtree({x:t,y:e,width:i/2,height:s/2},this.capacity),this.southeast=new Quadtree({x:t+i/2,y:e+s/2,width:i/2,height:s/2},this.capacity),this.southwest=new Quadtree({x:t,y:e+s/2,width:i/2,height:s/2},this.capacity),this.divided=!0}remove(t){if(!this.inBoundary(t))return!1;let e=this.points.findIndex((e=>e.x===t.x&&e.y===t.y));return-1!==e?(this.points.splice(e,1),!0):!!this.divided&&(this.northeast.remove(t)||this.northwest.remove(t)||this.southeast.remove(t)||this.southwest.remove(t))}query(t,e=[]){if(e||(e=[]),!this.intersects(t))return e;for(let i of this.points)i.x>=t.x-t.width&&i.x<=t.x+t.width&&i.y>=t.y-t.height&&i.y<=t.y+t.height&&e.push(i);return this.divided&&(this.northwest.query(t,e),this.northeast.query(t,e),this.southwest.query(t,e),this.southeast.query(t,e)),e}intersects(t){return!(t.x-t.width>this.boundary.x+this.boundary.width||t.x+t.width<this.boundary.x-this.boundary.width||t.y-t.height>this.boundary.y+this.boundary.height||t.y+t.height<this.boundary.y-this.boundary.height)}distanceToBoundary(t){const e=Math.max(this.boundary.x-this.boundary.width-t.x,0,t.x-this.boundary.x-this.boundary.width),i=Math.max(this.boundary.y-this.boundary.height-t.y,0,t.y-this.boundary.y-this.boundary.height);return Math.sqrt(e*e+i*i)}nearest(t,e=1/0,i=null){if(this.distanceToBoundary(t)>e)return{nearestPoint:i,minimumDistance:e};if(this.points.forEach((s=>{const n=Math.hypot(s.x-t.x,s.y-t.y);n<e&&(e=n,i=s)})),this.divided){const s=this.northeast.nearest(t,e,i);s.minimumDistance<e&&(e=s.minimumDistance,i=s.nearestPoint);const n=this.northwest.nearest(t,e,i);n.minimumDistance<e&&(e=n.minimumDistance,i=n.nearestPoint);const r=this.southeast.nearest(t,e,i);r.minimumDistance<e&&(e=r.minimumDistance,i=r.nearestPoint);const h=this.southwest.nearest(t,e,i);h.minimumDistance<e&&(e=h.minimumDistance,i=h.nearestPoint)}return{nearestPoint:i,minimumDistance:e}}}let rnd,sn,vec,canvas,W,H,globalQuadTree=null;function initGlobalQuadTree(t,e,i){globalQuadTree=new Quadtree({x:0,y:0,width:e,height:i},4),t.forEach((t=>globalQuadTree.insert(t)))}function generatePathsWithinPercent(t,e,i,s,n,r){globalQuadTree||initGlobalQuadTree(t,n,r);let h=[];for(let o=0;o<e;o++){let e=[],o={x:Math.random()*n,y:Math.random()*r},a=globalQuadTree.nearest(o).nearestPoint;if(!a)break;const d=Math.random()*(s-i)+i;for(;e.length<t.length*d;){e.push(a),globalQuadTree.remove(a);let t=globalQuadTree.nearest(a).nearestPoint;if(!t)break;a=t}h.push(e)}return h}function extendPaths(t,e){let i=[];return t.forEach((t=>{for(let s=0;s<e;s++){t.length>0&&i.push(t.pop());let e=t.length>0?t[0]:null,s=globalQuadTree.nearest(e).nearestPoint;if(!s)break;globalQuadTree.remove(s),t.unshift(s)}})),i.forEach((t=>globalQuadTree.insert(t))),t}function sdfPolys(t,e,i=1){let s=999999999;return t.map((t=>{let i=sdfPoly(t.shape,e);s=i>0?min(s,i):s})),min(abs(s),999999999)}function sdfPoly(t,e){let i=t.length,s=p5.Vector.dot(p5.Vector.sub(e,t[0]),p5.Vector.sub(e,t[0])),n=1;for(let r=0,h=i-1;r<i;h=r,r++){let i=p5.Vector.sub(t[h],t[r]),o=p5.Vector.sub(e,t[r]),a=p5.Vector.sub(o,p5.Vector.mult(i,constrain(p5.Vector.dot(o,i)/p5.Vector.dot(i,i),0,1)));s=min(s,p5.Vector.dot(a,a));let d=vec(e.y>=t[r].y,e.y<t[h].y,i.x*o.y>i.y*o.x);(d.x&&d.y&&d.z||!d.x&&!d.y&&!d.z)&&(n*=-1)}return n*sqrt(s)}function poissonSample(t,e,i,s,n,r=2,h=30){let o,a,d=(t,e)=>{o=max(r,n(t,e)),a=2*o},u=[],l=[],c=r/sqrt(2);for(let t=0;t<i;t+=c){let t=[];for(let e=0;e<s;e+=c)t.push(0);l.push(t)}let b=t=>{let e=floor(t.x/c),i=floor(t.y/c);l[e][i]=t,u.push(t)},y=(t,e=a)=>{let i=ceil(e/c),s=floor(t.x/c),n=floor(t.y/c);for(let e=s-i;e<=s+i;e++)for(let s=n-i;s<=n+i;s++){if(e>=l.length||s>=l[0].length||e<0||s<0)continue;let i=l[e][s];if(i&&dist(t.x,t.y,i.x,i.y)<o)return!1}return!0},p=[],m=createVector(rnd(t,t+i),rnd(e,e+s));for(p.push(m),b(m);p.length;){let n=floor(rnd(p.length)),r=p[n];d(r.x,r.y);let u=!0;for(let n=0;n<h;n++){let n=createVector(0,rnd(o,a));n.rotate(rnd(TAU));let h=p5.Vector.add(r,n);if(!(h.x<t||h.x>=t+i||h.y<e||h.y>=e+s)&&y(h)){p.push(h),b(h),u=!1;break}}u&&p.splice(n,1)}return u}class Poly{constructor(t,e=0,i=0,s=1,n=0,r=!0){this.shape=t.map((t=>{let r=vec(t.x,t.y);return r.rotate(n),vec(e+r.x*s,i+r.y*s)})),this.closed=r,this.inactive=[],this.inactive.length=this.shape.length,this.findBBox(),this.tex=null}static personpoints(){let t=[[99,371],[132,342],[155,300],[206,220],[232,163],[270,16],[230,86],[215,122],[203,152],[170,207],[144,238],[128,246],[147,196],[176,86],[184,24],[192,-41],[207,-189],[212,-282],[215,-441],[210,-454],[174,-394],[167,-378],[143,-282],[124,-213],[94,-109],[91,-101],[75,48],[56,-37],[24,-125],[-5,-234],[-37,-313],[-81,-390],[-125,-480],[-122,-450],[-113,-348],[-90,-205],[-69,-97],[-40,-16],[-4,103],[34,215],[47,254],[31,234],[4,191],[-29,130],[-70,60],[-112,6],[-90,59],[-46,170],[-9,268],[14,330],[40,359],[47,379],[42,394],[35,410],[38,423],[48,438],[70,452],[87,444],[107,430],[108,403],[96,38]].map((t=>vec(t[0],t[1])));return t.reverse(),t=t.map((t=>t.div(1e3))),t}static circle(t,e,i,s=.1){let n=[];for(let r=0;r<TAU;r+=s)n.push(vec(t+cos(r)*i,e+sin(r)*i));return new Poly(n)}onCanvas(t=0,e=width,i=0,s=height){return this.bbl>t&&this.bbr<e&&this.bbt>i&&this.bbb<s}findBBox(){this.bbl=999999,this.bbr=-999999,this.bbt=999999,this.bbb=-999999;for(let t of this.shape)t.x<this.bbl&&(this.bbl=t.x),t.x>this.bbr&&(this.bbr=t.x),t.y<this.bbt&&(this.bbt=t.y),t.y>this.bbb&&(this.bbb=t.y)}distort(t=100,e=500,i=0,s=!1){this.shape=this.shape.map((n=>vec(n.x+(s?rnd(-t,t):t*sn(n.x/e,n.y/e,100+i)),n.y+(s?rnd(-t,t):t*sn(n.x/e,n.y/e,1e3+i))))),this.findBBox()}resize(t,e,i,s,n=0){this.findBBox(),i=i??this.bbr-this.bbl,s=s??this.bbb-this.bbt;let r=vec((this.bbl+this.bbr)/2,(this.bbb+this.bbt)/2);return this.shape=this.shape.map((n=>{let h=vec((n.x-r.y)*i/(this.bbr-this.bbl),(n.y-r.y)*s/(this.bbb-this.bbt));return vec(t+h.x,e+h.y)})),this.findBBox(),this}draw(t=!0,e=!1){push(),null!=this.c&&(-1==this.c?noFill():fill(this.c)),null!=this.sc&&(-1==this.sc?noStroke():stroke(this.sc)),t&&(beginShape(),this.shape.map((t=>{e?curveVertex(t.x,t.y):vertex(t.x,t.y)})),this.closed?endShape(CLOSE):endShape()),pop()}}function setupRandom(){randomSeed(R.random_int(0,1e16)),noiseSeed(R.random_int(0,1e16)),rnd=(t,e)=>t instanceof Array?R.random_choice(t):void 0===t?R.random_dec():void 0===e?R.random_num(0,t):R.random_num(t,e),sn=(t,e,i)=>map(noise(t,e,i),0,1,-1,1)} keyPressed=()=>{"s"===key&&saveMySVG()};function saveSVGElement(t,e){t.setAttribute("xmlns","http://www.w3.org/2000/svg");var i=t.outerHTML,s=new Blob(['<?xml version="1.0" standalone="no"?>\r\n',i],{type:"image/svg+xml;charset=utf-8"}),n=URL.createObjectURL(s),r=document.createElement("a");return r.href=n,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r),t}function createSVGCanvas(t=!1){ns="http://www.w3.org/2000/svg",svg=document.createElementNS(ns,"svg"),groups=[],svg.setAttribute("width",width+"px"),svg.setAttribute("height",height+"px"),svg.setAttribute("viewBox","0 0 "+W+" "+H),svg.setAttribute("style","background-color:white;");let e=document.createElementNS(ns,"rect");e.setAttribute("x",0),e.setAttribute("y",0),e.setAttribute("width",W),e.setAttribute("height",H),e.setAttribute("fill","white");let i=document.createElementNS(ns,"g");return i.appendChild(e),i.setAttribute("id","rays"),i.setAttribute("style",`stroke-linejoin:bevel; fill:none; stroke-width:${SZ}; stroke:black;`),svg.appendChild(i),(t?globalQuadTree.query({x:0,y:0,width:W,height:H}):paths.flat()).map((t=>{let e=document.createElementNS(ns,"circle");e.setAttribute("cx",t.x+ptmargin),e.setAttribute("cy",t.y+ptmargin),e.setAttribute("r",SZ),e.setAttribute("fill","black"),e.setAttribute("stroke","none"),i.appendChild(e)})),svg}function saveMySVG(){let t=parseInt(tokenData.tokenId)%1e6+"-recto.svg";saveSVGElement(createSVGCanvas(),t);let e=parseInt(tokenData.tokenId)%1e6+"-verso.svg";saveSVGElement(createSVGCanvas(!0),e)}function setupUseful(){setupRandom(),vec=createVector,W=width,H=height}p5.disableFriendlyErrors=!0;;
}],