0x9b85a37a…aa34sent to0x942bc2d3…5c8a·#15,881,242·view on Etherscan
class Yucca{constructor(t){this.pos=pv(0,0),this.stemCount=t,this.stems=[],this.stems.push(this.makeStemPts(this.pos.x,this.pos.y));for(let t=0;t<this.stemCount;t++)this.stems.push(this.makeStemPts(this.stems[0][this.stems[0].length-1].x,this.stems[0][this.stems[0].length-1].y));if(this.stems.length>2){let t=[];this.stems[0].pop(),this.stems[this.stems.length-1].shift(),t.push(...this.stems[0]),t.push(...this.stems[this.stems.length-1]),this.stems[0]=t,this.stems.pop()}this.stemThickness=RR(28,34.5),this.stemsInflated=this.inflateStems(),this.stemBaseWidth=dist(this.stemsInflated[0][0].x,this.stemsInflated[0][0].y,this.stemsInflated[0][this.stemsInflated[0].length-1].x,this.stemsInflated[0][this.stemsInflated[0].length-1].y),this.shag=this.phylloshag(),this.crowns=this.placeCrowns(),this.crowns=this.inflateCrowns(),this.spears=this.makeSpears(),this.spearsInflated=this.inflateSpears(),this.flowers=this.makeFlowersFollow(),this.addAdditionalFlowerStems(),this.flowerBuds=[]}display(){for(let t=this.stemsInflated.length-1;t>=0;t--)this.drawShaggyStem(t),this.drawSpear(t),this.drawFlower(t),this.drawCrown(t)}drawShaggyStem(t){fill(cc[0]),noStroke(),beginShape(),natural&&fill(yc[0]);for(let e=0;e<this.stemsInflated[t].length;e++)vertex(this.stemsInflated[t][e].x*globalScaler,this.stemsInflated[t][e].y*globalScaler);endShape(CLOSE),stroke(cc[1]),strokeWeight(.0025*this.strokeBase*globalScaler),natural&&stroke(yc[1]);for(let e=0;e<this.shag[t].length;e++){let r=color(yc[7]),s=color(yc[1]),o=lerpColor(s,r,map(this.shag[t].length-e,this.shag[t].length/2.73,0,0,1));e%2!=0&&natural?stroke(o):natural&&stroke(yc[1]),line(this.shag[t][e][0].x*globalScaler,this.shag[t][e][0].y*globalScaler,this.shag[t][e][1].x*globalScaler,this.shag[t][e][1].y*globalScaler)}strokeWeight(.002*this.strokeBase*globalScaler)}drawSpear(t){stroke(cc[0]),fill(cc[1]),natural&&(stroke(yc[3]),fill(yc[2])),beginShape();for(let e=0;e<this.spearsInflated[t].length-1;e++)vertex(this.spearsInflated[t][e].x*globalScaler,this.spearsInflated[t][e].y*globalScaler);endShape()}drawFlower(t){for(let e=0;e<this.flowers[t].length;e++)stroke(cc[1]),natural&&stroke(yc[3]),line(this.flowers[t][e][0].x*globalScaler,this.flowers[t][e][0].y*globalScaler,this.flowers[t][e][1].x*globalScaler,this.flowers[t][e][1].y*globalScaler),noStroke(),fill(cc[1]),natural&&fill(yc[4]),ellipse(this.flowers[t][e][1].x*globalScaler,this.flowers[t][e][1].y*globalScaler,this.stemBaseWidth/14*globalScaler)}drawCrown(t){for(let e=0;e<this.crowns[t].length;e+=1)for(let r=0;r<this.crowns[t][e].length;r++){fill(cc[1]),stroke(cc[0]),natural&&(fill(yc[5]),stroke(yc[6])),beginShape();for(let s=0;s<this.crowns[t][e][r].length;s++)vertex(this.crowns[t][e][r][s].x*globalScaler,this.crowns[t][e][r][s].y*globalScaler);endShape()}}gatherBBs(){let t=[];for(let e=0;e<this.stems.length;e++){t.push(getBB(this.stems[e])),t.push(getBB(this.stemsInflated[e])),t.push(getBBdepth2(this.shag[e])),t.push(getBB(this.spears[e])),t.push(getBB(this.spearsInflated[e])),t.push(getBBdepth2(this.flowers[e]));for(let r=0;r<this.crowns[e].length;r++)t.push(getBBdepth2(this.crowns[e][r]))}return combineBB(t)}scaleToThisBB(t){return this.gatherBBs()}moveAndScale(t,e=pv(0,0),r=pv(0,0)){for(let s=0;s<this.stems.length;s++){translateArrDepth1(this.stems[s],e,r),scaleArr(this.stems[s],t,r),translateArrDepth1(this.stemsInflated[s],e,r),scaleArr(this.stemsInflated[s],t,r),translateArrDepth2(this.shag[s],e,r),scaleArrDouble(this.shag[s],t,r),translateArrDepth1(this.spears[s],e,r),scaleArr(this.spears[s],t,r),translateArrDepth1(this.spearsInflated[s],e,r),scaleArr(this.spearsInflated[s],t,r),translateArrDepth2(this.flowers[s],e,r),scaleArrDouble(this.flowers[s],t,r);for(let o=0;o<this.crowns[s].length;o++)translateArrDepth2(this.crowns[s][o],e,r),scaleArrDouble(this.crowns[s][o],t,r)}this.strokeBase=this.gatherBBs().width,this.stemBaseWidth=dist(this.stemsInflated[0][0].x,this.stemsInflated[0][0].y,this.stemsInflated[0][this.stemsInflated[0].length-1].x,this.stemsInflated[0][this.stemsInflated[0].length-1].y)}makeStemPts(t,e){let r=[];0==this.stems.length?(r=[pv(t,e),pointFrom(pv(t,e),180,10)]).push(pointFrom(r[1],180,RR(5,10))):(r=[pv(t,e),pointFrom(pv(t,e),pointDir(this.stems[0][this.stems[0].length-2],this.stems[0][this.stems[0].length-1])+90,10)]).push(pointFrom(r[1],pointDir(r[0],r[1])+90,RR(5,10)));let s=RR(1,10);0==this.stems.length&&(s=RR(1,10));for(let t=0;t<s;t++){let t=pointDir(r[r.length-2],r[r.length-1])-90;r.push(pointFrom(r[r.length-1],t,RR(5,10)))}let o=RR(-6,6);s=RR(10,20),0==this.stems.length&&(s=RR(5,7),o=RR(-o,o));for(let t=0;t<s;t++){let t=pointDir(r[r.length-2],r[r.length-1])-90;t<-250&&(t=-250),t>-120&&(t=-120),t+=o,r.push(pointFrom(r[r.length-1],t,RR(5,10)))}s=0==this.stems.length?RR(1,1):RR(5,41);for(let t=0;t<s;t++){let t=pointDir(r[r.length-2],r[r.length-1])-90;t+180<0&&(t+=1),t+180>0&&(t-=1),t+=RR(-5,5),r.push(pointFrom(r[r.length-1],t,RR(5,10)))}for(let t=0;t<10;t++)soften(r);return r}inflateStems(){let t=[];for(let e=0;e<this.stems.length;e++)0==e?t.push(inflate(this.stems[e],this.stemThickness,RR(1,1.5),1)):t.push(inflate(this.stems[e],this.stemThickness,1,RR(.5,1)));return t}phyllotaxis(t,e,r=100,s=10,o=20,l=[0,0,0,0],a=1){let i=[],n=RR(0,20),h=[RR(.5,1.5),RR(.5,1.5)],c=RR(0,50);for(let p=0,g=0;p<360*r;p+=137.5,g+=1){let u=RR(-n,n),f=RR(-n,n),x=map(g,0,360,h[0],h[1]),d=createVector(t+sin(radians(p))*(sin(radians(map(g+l[0]*a,0,360*r/137.5+l[0]*a,0,180)))*s),e+cos(radians(map(g+l[1]*a,0,360*r/137.5+l[1]*a,c,180)))*s),m=createVector(t+sin(radians(p))*(sin(radians(map(g+l[2]*a,0,360*r/137.5+l[2]*a,0,180)))*(o*x)+u),e+cos(radians(map(g+l[3]*a,0,360*r/137.5+l[3]*a,c,180)))*(o*x)+f);i.push([d,m])}return i.sort(function(r,s){return dist(s[1].x,s[1].y,t,e-60)-dist(r[1].x,r[1].y,t,e-60)}),i}placeCrowns(){let t=[];for(let e=0;e<this.stems.length;e++){let r=RR(1,15);this.stems.length>1&&(r=RR(1,15)),0==e&&this.stems[0].length<50&&(r=RR(30,50)),t.push(this.phyllotaxis(this.stems[e][this.stems[e].length-1].x,this.stems[e][this.stems[e].length-1].y,RR(20,60),0,2*this.stemBaseWidth,[r,r,r,r],1))}return t}inflateCrowns(){let t=[];for(let e=0;e<this.crowns.length;e++){let r=[];for(let t=0;t<this.crowns[e].length;t++){let s=[];s.push(inflate(this.crowns[e][t],5,1,0)),r.push(s)}t.push(r)}return t}makeSpears(){let t=[];for(let e=0;e<this.stems.length;e++){let r=[];r.push(this.stems[e][this.stems[e].length-1]),r.push(pointFrom(r[0],180,10));let s=RR(30,30);for(let t=0;t<s;t++){let t=pointDir(r[r.length-2],r[r.length-1])-90;r.push(pointFrom(r[r.length-1],t,10))}let o=RR(-2.5,2.5);for(let t=0;t<s;t++){let t=pointDir(r[r.length-1],r[r.length-2])+90;t<0&&(t+=360),(t<5||t>355)&&(t=0,o=0),t+=o,r.push(pointFrom(r[r.length-1],t,6))}for(let t=0;t<10;t++)soften(r);t.push(r)}return t}inflateSpears(){let t=[];for(let e=0;e<this.spears.length;e++){let r=inflate(this.spears[e],7,RR(.6,1.2),.1);for(let t=0;t<1;t++)soften(r);t.push(r)}for(let e=this.crowns.length-1;e>=0;e--)for(let r=this.crowns[e].length-1;r>=0;r--)if(pointInsideShape(this.crowns[e][r][0][1],t[e])){this.crowns[e].splice(r,1)}return t}phylloshag(){let t=[];for(let e=0;e<this.stems.length;e++){let r=[],s=0;for(let t=0;t<this.stems[e].length-1;t++){let o=pointDir(this.stems[e][t],this.stems[e][t+1]),l=dist(this.stems[e][t].x,this.stems[e][t].y,this.stemsInflated[e][t].x,this.stemsInflated[e][t].y),a=RR(0,360);for(let i=0;i<1;i+=.03){let n=pv(lerp(this.stems[e][t].x,this.stems[e][t+1].x,i),lerp(this.stems[e][t].y,this.stems[e][t+1].y,i)),h=map(i,0,1,0+a,360+a),c=map(t,s,this.stems[e].length,10,20);0==e&&this.stems.length>1&&(c=10);let p=map(t,s,this.stems[e].length,1,2);0==e&&this.stems.length>1&&(p=map(t,s,this.stems[e].length,1,1));let g=pv(sin(radians(137.5*h))*sin(radians(h))*l,-c),u=pv(sin(radians(137.5*h))*sin(radians(h))*(l*p*RR(1,1.3)),1);rotatePoint(u,pv(0,0),radians(o+90)),rotatePoint(g,pv(0,0),radians(o+90));let f=pointFrom(n,o,0);u.add(n.x,n.y),g.add(f.x,f.y),r.push([g,u])}}t.push(r)}return t}makeFlowersFollow(){let t=[];for(let e=0;e<this.spears.length;e++){let r=[],s=RR(.3,.8),o=60,l=Math.floor(RR(0,360)),a=RR(0,10),i=RR(20,35),n=RR(40,90);for(let t=this.spears[e].length-Math.floor(this.spears[e].length*s);t<this.spears[e].length-(1+a);t++){let a=pointDir(this.spears[e][t],this.spears[e][t+1])-90-180,h=map(t,this.spears[e].length-Math.floor(this.spears[e].length*s),this.spears[e].length-1,0,180);n+=RR(-5,5);let c=pv(sin(radians(137.5*t+l))*sin(radians(h))*n,-i);rotatePoint(c,pv(0,0),radians(a)),c.add(this.spears[e][t].x,this.spears[e][t].y),r.push([this.spears[e][t],c]),(o-=4)<0&&(o=0)}t.push(r)}return t}addAdditionalFlowerStems(){for(let t=0;t<this.spears.length;t++){let e=[];for(let r=0;r<this.flowers[t].length;r++){let s=pointDir(this.flowers[t][r][0],this.flowers[t][r][1]),o=dist(this.flowers[t][r][0].x,this.flowers[t][r][0].y,this.flowers[t][r][1].x,this.flowers[t][r][1].y);for(let l=RR(.3,.5);l<1;l+=5/o){let o=pv(lerp(this.flowers[t][r][0].x,this.flowers[t][r][1].x,l),lerp(this.flowers[t][r][0].y,this.flowers[t][r][1].y,l)),a=pointFrom(o,s-map(l,.5,1,20,60),map(l,0,1,1,RR(5,20)));e.push([o,a]),a=pointFrom(o,s+180+map(l,.5,1,20,60),map(l,0,1,1,RR(5,20))),e.push([o,a])}}this.flowers[t].push(...e)}return[]}}