memoscan
← all memos

Memo 0xf4afff4a…709b0f on Ethereum

///8 //STRUCTURE class StyPl{ constructor(vs,bCl,bSm,bTap,bIsDot,sSty,fSty,th,maxGap,maxLen,bVShade=F){ this.verts=vs; this.bClosed=bCl; this.bSmooth=bSm; this.bTapered=bTap; this.bVertexShade=bVShade; this.bIsDot=bIsDot; this.strokeStyle=sSty; this.fillStyle=fSty; this.thickness=th; this.dashGap=maxGap; this.dashLen=maxLen; }} class Structure{ constructor(t,cx,cy,id,ovrrStr=null){ this.type=t;this.id=id; this.pIs=[]; this.springs=[]; this.history=[]; this.whichParticleIsGrabbed=-1; this.whichParticleIsMostRecentlyAdded=-1; this.boundingBox={"L":0,"T":0,"R":0,"B":0}; this.SMOOTHING=1.5;this.SCRUNCHING=-0.25;this.TWISTING=0.001; this.PRPA=0;this.PRPB=0;this.PRPC=0;this.STID=0; this.MASSMULT=1.; this.bShowEnclBl=F;this.bShoVorCls=F; this.bShoVorEdgs=F;this.bShoVorNuc=F; this.bFlocking=F;this.bGrowing=F; this.bGreedy=F;this.hasEncl=F; this.bFull=F;this.bLoop=F; this.groSzLm=1e5; this.lastAddSegmentTime=myFrmCnt; this.siteAttachId=-1; this.isEnclosedByStructureID=-1; this.labelsStructureID=-1; this.isLabeledByStructureID=-1; let minWheelLen=7;let minUrchLen=7; let minTrsLen=2;let minCntLen=3; let dashLen=2; switch(this.type){ case ST1:{let t=4;this.STID=StSh.loopSty,this.MASSMULT=StSh.loopMssMlt,this.bLoop=T,this.hasEncl=T,this.bGrowing=T,this.bGreedy=StSh.bLoopGrdy,this.bShowEnclBl=StSh.bLoopShoEnclBl;let r=max(t,StSh.loopInitSz),S=StSh.loopSzTgt,s=StSh.loopSzVar;this.groSzLm=round(S+myRAB(-1,1)*s),this.groSzLm=max(this.groSzLm,r),ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.initSz&&(r=ovrrStr.initSz),ovrrStr.tgtSz&&(this.groSzLm=ovrrStr.tgtSz)),this.initStructure(cx,cy,r,0)}break; case ST4:let t=[0,1,2,3,4,5,6,7,8,9,11,14,16,17];this.STID=t[this.id%t.length],this.MASSMULT=StSh.wheelMassMultiplier,this.bLoop=T,this.hasEncl=T,this.bGrowing=T;let r=20;switch(this.groSzLm=64,ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.initSz&&(r=ovrrStr.initSz),ovrrStr.tgtSz&&(this.groSzLm=ovrrStr.tgtSz)),this.STID){case 0:this.bShowEnclBl=myR01()<.7,this.bShoVorCls=myR01()<.2;break;case 1:this.bShowEnclBl=myR01()<.2;break;case 2:this.bShoVorCls=T,this.bShoVorEdgs=T,this.bShoVorNuc=T;break;case 3:this.bShowEnclBl=myR01()<.4;break;case 4:let t=myR01();t<.35?this.bShowEnclBl=T:t<.7?(this.bShoVorCls=T,this.bShoVorEdgs=T,this.bShoVorNuc=myR01()<.6):(this.bShowEnclBl=T,this.bShoVorCls=T,StSh.bDoFillSiteBlobs&&255!=StSh.siteBlbFCol?this.bShoVorEdgs=myR01()<.3:(this.bShoVorNuc=myR01()<.2,this.bShoVorEdgs=T));break;case 5:case 9:case 13:case 17:break;case 6:this.bShowEnclBl=myR01()<.75;break;case 7:this.bShowEnclBl=myR01()<.3;break;case 8:let r=myR01();r<.3?this.bShowEnclBl=T:r<.5?(this.bShoVorCls=T,this.bShoVorEdgs=T,this.bShoVorNuc=myR01()<.05):r<.8&&(this.bShowEnclBl=T,this.bShoVorCls=T,this.bShoVorEdgs=T);break;case 10:this.bShowEnclBl=T;break;case 11:this.bShowEnclBl=T,this.bShoVorCls=T,this.bShoVorEdgs=T;break;case 12:this.bShowEnclBl=myR01()<.75,this.bShoVorCls=F;break;case 15:this.bShowEnclBl=myR01()<.25;break;case 16:this.bShowEnclBl=myR01()<.04,this.bShoVorCls=myR01()<.7}this.initStructure(cx,cy,max(minWheelLen,r),0);break; case ST0:{this.bFlocking=T;let t=2;this.bLoop=F,this.hasEncl=F,this.bGrowing=T;let r=3;this.bGreedy=StSh.lineStrcGreedy;let S=StSh.lineLenTgt,s=StSh.lineLenVar,i=round(S+myRAB(-1,1)*s);this.groSzLm=i,this.STID=StSh.linSty,this.MASSMULT=StSh.lineMassMultiplier;let h=0;ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.initSz&&(r=ovrrStr.initSz),ovrrStr.tgtSz&&(this.groSzLm=ovrrStr.tgtSz),ovrrStr.initAng&&(h=ovrrStr.initAng)),this.initStructure(cx,cy,max(t,r),h)}break; case ST3:{this.bFlocking=T,this.bLoop=F,this.hasEncl=T,this.bGrowing=T,this.STID=StSh.trsSty;let t=int(abs(myRGauss(0,StSh.trsTgtLenStd)));this.groSzLm=StSh.trsTgtLenMin+t;let r=StSh.trsMinLen,S=0;ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.initSz&&(r=ovrrStr.initSz),ovrrStr.tgtSz&&(this.groSzLm=ovrrStr.tgtSz),ovrrStr.initAng&&(S=ovrrStr.initAng)),this.initStructure(cx,cy,max(minTrsLen,r),S)}break; case ST2:{this.STID=StSh.dashStructureStyle,this.MASSMULT=StSh.dashMassMultiplier,this.bLoop=F,this.hasEncl=F,this.bFlocking=T,this.initStructure(cx,cy,dashLen,0);let t=this.pIs[1];for(let r=0;r<10;r++){let S=myPs[t].p.x,s=myPs[t].p.y;this.history[r]=CV(S,s)}}break; case ST5:{this.bLoop=F,this.hasEncl=F,this.bGrowing=T,this.groSzLm=StSh.starSzTgt,this.STID=StSh.starStructureStyle;let t=myRI(5,7),r=0;ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.initSz&&(r=ovrrStr.initSz),ovrrStr.nSpokes&&(t=ovrrStr.nSpokes),ovrrStr.tgtSz&&(this.groSzLm=ovrrStr.tgtSz)),this.PRPA=t,this.PRPB=Cs(r,0,20),this.initStructure(cx,cy,this.PRPA,this.PRPB)}break; case ST9:{this.bLoop=T,this.hasEncl=T,this.bShowEnclBl=F,this.MASSMULT=StSh.ballMassMultiplier,this.STID=StSh.ballStructureStyle==PARTY_STYLE?this.id%5:StSh.ballStructureStyle,ovrrStr&&(this.STID=ovrrStr.style),this.bFlocking=5==this.STID||6==this.STID?F:T,this.PRPA=StSh.ballStructureEccentricity,this.PRPB=StSh.ballStructureSymmetry;let t=map(this.STID,0,7,.85,1.3,T);this.STID>=10&&(t=myRAB(1.05,1.25)),this.initStructure(cx,cy,StSh.nSpokesPerBall,t)}break; case ST6:{this.STID=StSh.treeStructureStyle,this.MASSMULT=StSh.treeMassMultiplier,this.bLoop=F,this.hasEncl=F,this.bGrowing=T,this.bGreedy=StSh.bTreeUseGreedyGrowth,this.groSzLm=StSh.treeGrowthSizeLimit,this.PRPA=StSh.treeStructureBranchDiminishFactor,this.PRPB=StSh.treeBranchMutualRepulsionFactor;let t=3;ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.nSpokes&&(t=ovrrStr.nSpokes)),this.initStructure(cx,cy,t,0)}break; case ST7:{let t=16,r=3;switch(this.STID=(StSh.urchinStructureCounter+this.id)%4,ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.spineLen&&(r=ovrrStr.spineLen),ovrrStr.urchinLen&&(t=ovrrStr.urchinLen,this.groSzLm=t)),this.STID){case 0:case 2:case 3:break;case 1:this.bShoVorCls=T,this.bShoVorEdgs=T,this.bShoVorNuc=T}this.bLoop=T,this.hasEncl=T,this.PRPA=r,this.initStructure(cx,cy,max(minUrchLen,t),r)}break; case ST8:{this.bLoop=T,this.hasEncl=T,this.bFlocking=T,this.bLoopShoEnclBl=F,this.STID=StSh.centiStructureStyle;let t=StSh.centiStructureLength,r=myRAB(.25,.8);ovrrStr&&(this.STID=ovrrStr.style,ovrrStr.initSz&&(t=ovrrStr.initSz),ovrrStr.tgtSz&&(t=ovrrStr.tgtSz),r=myRAB(.6,.9)),this.PRPA=r,this.initStructure(cx,cy,max(minCntLen,t),0);let S=this.pIs[this.pIs.length-1];for(let t=0;t<10;t++){let r=myPs[S].p.x,s=myPs[S].p.y;this.history[t]=CV(r,s)}}break; case ST10:this.bLoop=F,this.hasEncl=F,this.STID=StSh.mbr_STYLE_ID,this.PRPA=StSh.mbrLoopPerimeterReductionFactor,this.PRPB=StSh.nMemLayers,this.PRPC=StSh.mbrInnermostRingMass,this.initStructure(cx,cy,StSh.nMemLayers,0);break; case ST11:this.PRPA=StSh.nOffRIngs,this.PRPB=StSh.offsetRingSpacing,this.PRPC=StSh.firstOffsetRingSpacing,this.STID=StSh.bGappyOffsetCurves;break; case ST12:this.siteAttachId=-1,this.isEnclosedByStructureID=-1,this.labelsStructureID=-1,this.MASSMULT=2,this.PRPA="A",this.PRPB=F,this.PRPC=null,this.bShowEnclBl=F,this.hasEncl=T,this.bLoop=T,ovrrStr&&(ovrrStr.letter&&(this.PRPA=ovrrStr.letter),ovrrStr.labelsStructureID&&ovrrStr.labelsStructureID>0&&ovrrStr.labelsStructureID<mySs.length&&(this.labelsStructureID=ovrrStr.labelsStructureID,mySs[this.labelsStructureID].isLabeledByStructureID=this.id),ovrrStr.bInverse&&(this.PRPB=ovrrStr.bInverse)),this.initStructure(cx,cy,0,0);break; case ST13:this.PRPA=0,this.PRPB=0,this.initStructure(cx,cy,0,0)} let nPinS=this.pIs.length;if(this.type!=ST10){nInteriorPoints+=nPinS;for(let t=0;t<nPinS;t++){let s=this.pIs[t],n=myPs[s];d3Data.push(n.p.x),d3Data.push(n.p.y)}}else for(let t=0;t<nPinS;t++){let s=this.pIs[t];if(s>nMaskPoints){nInteriorPoints++;let t=myPs[s];d3Data.push(t.p.x),d3Data.push(t.p.y)}}}; setDisplayEnclosedBlobs(b){this.bShowEnclBl=b;} initStructure(t,s,i,e){let n=this.id+myRAB(0,PI2);const a=sqrt(2);switch(this.type){ case ST12:{this.addInitialParticleAtLocation(t,s);let i=REST_L,e=9;for(let n=0;n<e;n++){let a=n/e*PI2,l=t+i*cos(a),r=s+i*sin(a);this.addInitialParticleAtLocation(l,r)}for(let t=0;t<e;t++){let s=this.pIs[0],e=this.pIs[t+1],n=new Spring(myPs);n.setParticleIndicesAndRestLength(s,e,i,SPR_K),this.springs.push(n)}for(let t=0;t<e;t++){let s=this.pIs[t%e+1],i=this.pIs[(t+1)%e+1],n=this.pIs[(t+2)%e+1],a=Sb(myPs[i].p,myPs[s].p).mag(),l=new Spring(myPs);l.setParticleIndicesAndRestLength(s,i,a,SPR_K),this.springs.push(l);let r=Sb(myPs[n].p,myPs[s].p).mag(),h=new Spring(myPs);h.setParticleIndicesAndRestLength(s,n,r,SPR_K),this.springs.push(h)}}break; case ST13:case ST11:break; case ST10:if(i>0){let t=0;for(let s=0;s<nMaskPoints;s++){let i=myPs[s%nMaskPoints],e=myPs[(s+1)%nMaskPoints];t+=dist(i.p.x,i.p.y,e.p.x,e.p.y)}let s=t/nMaskPoints;for(let t=0;t<nMaskPoints;t++){let s=t%nMaskPoints;myPs[s].bIsABoundarySite=T,myPs[s].isOfStrc=this.id,myPs[s].bFixed=T,this.pIs.push(s)}let e=this.pIs.length/nMaskPoints,n=this.PRPA,a=s*sqrt(3)/2*pow(n,e),l=SPR_K*pow(.97,e);for(let t=0;t<nMaskPoints;t++){let s=t%nMaskPoints,i=(t+1)%nMaskPoints,e=myPs[s],n=myPs[i],r=n.p.x-e.p.x,h=n.p.y-e.p.y,P=sqrt(r*r+h*h),p=e.p.x-h/P*a,c=e.p.y+r/P*a;p+=.5*r,c+=.5*h,this.addInitialParticleAtLocation(p,c);let o=myPs.length-1,I=l*myRAB(.95,1.05),d=l*myRAB(.95,1.05),R=new Spring(myPs);R.setParticleIndicesAndRestLength(s,o,a,I),this.springs.push(R),R=new Spring(myPs),R.setParticleIndicesAndRestLength(i,o,a,d),this.springs.push(R)}for(let t=0;t<nMaskPoints;t++){let s=nMaskPoints+t%nMaskPoints,i=nMaskPoints+(t+1)%nMaskPoints,e=this.pIs[s],n=this.pIs[i],r=new Spring(myPs),h=l*myRAB(.95,1.05);r.setParticleIndicesAndRestLength(e,n,a,h),this.springs.push(r)}3==this.STID&&i%2==1&&(i>6?i--:i++);for(let t=0;t<i-1;t++)this.addSegment()}break; case ST2:{let i=1,e=t+cos(n)*i*REST_L,a=s+sin(n)*i*REST_L;this.addInitialParticleAtLocation(t,s),this.addInitialParticleAtLocation(e,a);let l=this.pIs[0],r=this.pIs[1];myPs[r].mass*=.25;let h=new Spring(myPs);h.setParticleIndicesAndRestLength(l,r,i*REST_L,SPR_K),this.springs.push(h)}break; case ST6:{this.addInitialParticleAtLocation(t,s);let e=1*REST_L;for(let a=0;a<i;a++){let l=map(a,0,i,0,PI2)+n,r=t+e*cos(l),h=s+e*sin(l);this.addInitialParticleAtLocation(r,h)}let a=this.pIs[0];for(let t=0;t<i;t++){let s=this.pIs[t+1],i=new Spring(myPs);i.setParticleIndicesAndRestLength(a,s,REST_L,SPR_K),this.springs.push(i)}}break; case ST5:{this.addInitialParticleAtLocation(t,s);let a=1*REST_L;for(let e=0;e<i;e++){let l=e/i*PI2+n,r=t+a*cos(l),h=s+a*sin(l);this.addInitialParticleAtLocation(r,h)}let l=this.pIs[0];for(let t=0;t<i;t++){let s=this.pIs[t+1],i=new Spring(myPs);i.setParticleIndicesAndRestLength(l,s,REST_L,SPR_K),this.springs.push(i)}for(let t=0;t<e;t++)this.addSegment()}break; case ST9:{this.addInitialParticleAtLocation(t,s);const n=1*REST_L*e;let a=this.PRPA,l=n*(2/(1+1/a)),r=n*(2/(1+1/a))/a,h=this.PRPB;for(let e=0;e<i;e++){let n=e/i*PI2,a=1+h*cos(n+Rd(90*h)),P=t+a*l*cos(n),p=s+a*r*sin(n);this.addInitialParticleAtLocation(P,p)}let P=this.pIs[0];for(let t=0;t<i;t++){let s=t/i*PI2,e=1+h*cos(s+Rd(90*h)),n=e*l*cos(s),a=e*r*sin(s),p=sqrt(n*n+a*a),c=this.pIs[t+1],o=new Spring(myPs);o.setParticleIndicesAndRestLength(P,c,p,SPR_K),this.springs.push(o)}for(let t=0;t<i;t++){let s=this.pIs[t%i+1],e=this.pIs[(t+1)%i+1],n=myPs[s].p.x-myPs[e].p.x,a=myPs[s].p.y-myPs[e].p.y,l=sqrt(n*n+a*a),r=new Spring(myPs);r.setParticleIndicesAndRestLength(s,e,l,SPR_K),this.springs.push(r)}for(let t=0;t<i;t++){let s=this.pIs[t+1],e=this.pIs[(t+2)%i+1],n=myPs[s].p.x-myPs[e].p.x,a=myPs[s].p.y-myPs[e].p.y,l=sqrt(n*n+a*a),r=new Spring(myPs);r.setParticleIndicesAndRestLength(s,e,l,.2*SPR_K),this.springs.push(r)}}break; case ST0:0!=e&&(n=e);for(let e=0;e<i;e++){let a=map(e,0,i-1,-1,1),l=t+1*a*cos(n)*REST_L,r=s+1*a*sin(n)*REST_L+.1*myRAB(-1,1);e==~~(i/2)&&(l+=.5*myRAB(-1,1),r+=.5*myRAB(-1,1)),this.addInitialParticleAtLocation(l,r)}for(let t=0;t<i-1;t++){let s=this.pIs[t],i=this.pIs[t+1],e=new Spring(myPs);e.setParticleIndicesAndRestLength(s,i,REST_L,SPR_K),this.springs.push(e)}break; case ST1:{let e=REST_L*i*1/PI2;for(let a=0;a<i;a++){let l=map(a,0,i,0,PI2)+n,r=t+e*cos(l),h=s+e*sin(l);this.addInitialParticleAtLocation(r,h)}for(let t=0;t<i;t++){let s=this.pIs[t],e=this.pIs[(t+1)%i],n=new Spring(myPs);n.setParticleIndicesAndRestLength(s,e,REST_L,SPR_K),this.springs.push(n)}}break; case ST3:{let n=Rd(myRAB(-30,30))+(myR01()<.5?PI:0);e&&(n=e);let l=sin(n),r=cos(n);for(let e=0;e<i;e++){let n=map(e,0,i-1,-~~(i/2),~~(i/2)),a=t+1*n*REST_L,h=s-1*REST_L*.5,P=t+1*n*REST_L,p=s+1*REST_L*.5,c=r*(a-t)+l*(h-s)+t,o=r*(h-s)-l*(a-t)+s,I=r*(P-t)+l*(p-s)+t,d=r*(p-s)-l*(P-t)+s;this.addInitialParticleAtLocation(c,o),this.addInitialParticleAtLocation(I,d)}for(let t=0;t<i-1;t++){let s=this.pIs[2*t],e=this.pIs[2*t+1],n=this.pIs[2*(t+1)],l=this.pIs[2*(t+1)+1],r=[[s,e],[s,n],[e,l],[s,l],[n,e]],h=[1,1,1,a,a];for(let t=0;t<r.length;t++){let s=new Spring(myPs),i=r[t][0],e=r[t][1];s.setParticleIndicesAndRestLength(i,e,REST_L*h[t],SPR_K),this.springs.push(s)}if(t==i-2){let t=new Spring(myPs);t.setParticleIndicesAndRestLength(n,l,REST_L,SPR_K),this.springs.push(t)}}}break; case ST8:{const e=.9*REST_L;if(i>=10){let n=i*e*.75/PI2,a=myRAB(0,360);for(let l=0;l<i;l++){let r=Rd(a+map(l,0,i-1,20,340)),h=sin(r),P=cos(r),p=t+1*(n-.9*e)*P,c=s+1*(n-.9*e)*h,o=t+1*(n-.4*e)*P,I=s+1*(n-.4*e)*h,d=t+1*(n+.4*e)*P,R=s+1*(n+.4*e)*h,S=t+1*(n+.9*e)*P,L=s+1*(n+.9*e)*h;this.addInitialParticleAtLocation(o,I),this.addInitialParticleAtLocation(d,R),l!=i-1&&(this.addInitialParticleAtLocation(p,c),this.addInitialParticleAtLocation(S,L))}}else for(let n=0;n<i;n++){let a=map(n,0,i-1,-~~(i/2),~~(i/2)),l=t+1*a*e,r=t+1*a*e,h=s-1*e*1.5,P=s-1*e*.5,p=s+1*e*.5,c=s+1*e*1.5;this.addInitialParticleAtLocation(l,P),this.addInitialParticleAtLocation(r,p),n!=i-1&&(this.addInitialParticleAtLocation(l,h),this.addInitialParticleAtLocation(r,c))}myPs[this.pIs[2]].isOfStrc=-1,myPs[this.pIs[3]].isOfStrc=-1;let n=this.pIs[2],l=this.pIs[3];myPs[n].set(BDM/2,BDM/2),myPs[l].set(BDM/2,BDM/2+myRA(1));for(let t=0;t<i-1;t++){let s=map(t,0,i-1,0,PI),n=.5+sin(s),l=n*this.PRPA,r=this.pIs[4*t],h=this.pIs[4*t+1],P=this.pIs[4*(t+1)],p=this.pIs[4*(t+1)+1];const c=[[r,h],[r,P],[h,p],[r,p],[P,h],[this.pIs[4*t+2],r],[h,this.pIs[4*t+3]]],o=[n,1,1,a,a,l,l];let I=t>0?c.length:c.length-2;for(let t=0;t<I;t++){let s=new Spring(myPs),i=c[t][0],n=c[t][1];s.setParticleIndicesAndRestLength(i,n,e*o[t],SPR_K),this.springs.push(s)}if(t==i-2){let t=new Spring(myPs);t.setParticleIndicesAndRestLength(P,p,.5*e*o[0],SPR_K),this.springs.push(t)}}}break; case ST4:{let e=REST_L*i*1/PI2;for(let a=0;a<i;a++){let l=map(a,0,i,0,PI2)+n,r=t+e*cos(l),h=s+e*sin(l),P=t+(e+1*REST_L)*cos(l),p=s+(e+1*REST_L)*sin(l);this.addInitialParticleAtLocation(r,h),this.addInitialParticleAtLocation(P,p)}noiseDetail(3,.3);const l=this.id,r=.25,h=.35,P=-.33,p=.33;for(let t=0;t<i;t++){let s=this.pIs[2*t%(2*i)],e=this.pIs[(2*t+1)%(2*i)],n=this.pIs[2*(t+1)%(2*i)],c=this.pIs[(2*(t+1)+1)%(2*i)];const o=t/i*PI2,I=[1,1,1,a,a],d=[[s,e],[s,n],[e,c],[s,c],[n,e]];for(let t=0;t<d.length;t++){let s=new Spring(myPs),i=d[t][0],e=d[t][1],n=l+.7*cos(o),a=l+.7*sin(o),c=1+r*map(noise(n,a)-h,P,p,-1,1,T);s.setParticleIndicesAndRestLength(i,e,c*REST_L*I[t],SPR_K),this.springs.push(s)}}}break; case ST7:{let l,r,h=myR01()<.5?-1:1,P=REST_L*i*1/PI2;for(let a=0;a<i;a++){let p=1*REST_L,c=map(a,0,i,0,PI2)+n,o=t+(P+0*p)*cos(c),I=s+(P+0*p)*sin(c),d=t+(P+1*p)*cos(c),R=s+(P+1*p)*sin(c);this.addInitialParticleAtLocation(o,I),this.addInitialParticleAtLocation(d,R);let S=P+1*p;for(let i=0;i<e;i++)l=t+S*cos(c),r=s+S*sin(c),this.addInitialParticleAtLocation(l,r),S+=p,p*=.8,c+=h*Rd(10)}let p=e+2;for(let t=0;t<i;t++){let s=this.pIs[t*p%(i*p)],n=this.pIs[(t*p+1)%(i*p)],l=this.pIs[(t+1)*p%(i*p)],r=this.pIs[((t+1)*p+1)%(i*p)],h=[[s,n],[s,l],[n,r],[s,r],[l,n]],P=[1,1,1,a,a];for(let t=0;t<h.length;t++){let s=new Spring(myPs),i=h[t][0],e=h[t][1];s.setParticleIndicesAndRestLength(i,e,REST_L*P[t],SPR_K),this.springs.push(s)}let c=REST_L;for(let s=0;s<e;s++){let e=new Spring(myPs),n=this.pIs[(t*p+(s+1))%(i*p)],a=this.pIs[(t*p+(s+2))%(i*p)];e.setParticleIndicesAndRestLength(n,a,c,SPR_K),this.springs.push(e),c*=.9}}this.purgeInteriorParticles()}}} growStructureOnRequest(){let e=1;switch(this.type){default:break;case ST0:this.bGreedy=F,this.groSzLm=this.pIs.length,e=2;break;case ST1:e=4;break;case ST4:case ST6:e=8;break;case ST5:e=1;break;case ST3:e=this.groSzLm<6?1:2}this.groSzLm+=e,this.bGrowing=T} growStructureIfGrowing(){const t=StSh.growthUpdateCycleLength,e=myFrmCnt%t;if(this.id%t==e){if(this.bGreedy){myFrmCnt-this.lastAddSegmentTime>StSh.greedyAddTimeout&&(this.bGrowing=F)}if(this.bGrowing)switch(this.type){default:break; case ST0:case ST1:case ST4:case ST6:this.pIs.length<this.groSzLm?this.addSegment():this.bGrowing=F;break; case ST5:this.PRPB<this.groSzLm?this.addSegment():this.bGrowing=F;break; case ST3:this.pIs.length/2<this.groSzLm?this.addSegmentClosestToLocation(BDM/2,BDM/2):this.bGrowing=F}}} addSegment(s=0){const t=this.pIs.length,e=sqrt(2);switch(this.type){default:break; case ST10:{let s=0;for(let t=0;t<nMaskPoints;t++){let e=myPs[t%nMaskPoints],i=myPs[(t+1)%nMaskPoints];s+=dist(e.p.x,e.p.y,i.p.x,i.p.y)}let e,i=s/nMaskPoints,n=this.pIs.length/nMaskPoints,h=this.PRPA,p=i*sqrt(3)/2*pow(h,n),r=SPR_K*pow(.97,n),P=t-nMaskPoints;for(let s=0;s<nMaskPoints;s++){let t=P+s%nMaskPoints,e=P+(s+1)%nMaskPoints,i=this.pIs[t],n=this.pIs[e],h=myPs[i],r=myPs[n],l=r.p.x-h.p.x,m=r.p.y-h.p.y,a=sqrt(l*l+m*m),y=h.p.x-m/a*p,S=h.p.y+l/a*p;y+=.5*l,S+=.5*m,this.addInitialParticleAtLocation(y,S)}let l=P+nMaskPoints,m=this.PRPC+this.STID,a=StSh.mbr3pointSkip,y=StSh.mbrInnerWiggleAmp,S=StSh.mbrInnerWiggleFrq;3!=this.STID&&10!=this.STID&&2!=this.STID||(y=0);for(let s=0;s<nMaskPoints;s++){let t=l+s%nMaskPoints,i=l+(s+1)%nMaskPoints,n=P+s%nMaskPoints,h=P+(s+1)%nMaskPoints,I=this.pIs[t],g=this.pIs[i],o=this.pIs[n],c=this.pIs[h],d=map(s,0,nMaskPoints,0,PI2),u=p*(1+y*sin(S*d));e=new Spring(myPs),e.setParticleIndicesAndRestLength(I,g,u,r),this.springs.push(e),e=new Spring(myPs);let T=3==this.STID&&s%a==0?.5*u:u;T*=1+.1*cos(d-m),e.setParticleIndicesAndRestLength(I,o,T,r),this.springs.push(e),e=new Spring(myPs),e.setParticleIndicesAndRestLength(I,c,T,r),this.springs.push(e)}this.lastAddSegmentTime=myFrmCnt}break; case ST6:if(t<this.groSzLm){let s=StSh.maxSpringsPerParticle,e=F,i=-1,n=0,h=0;for(;!e&&h<100;){let p=myRI(1,t-1),r=this.pIs[p];h++;let P=0,l=0;const m=this.springs.length;for(let s=0;s<m;s++){let t=this.springs[s].getIP(),e=this.springs[s].getIQ();if(r==t||r==e){P++;let t=this.springs[s].getRestL();t>l&&(l=t)}}P<s&&(e=T,i=p,n=l)}if(this.bGreedy){if(i>=0){let s=this.pIs[i],t=myPs[s].p.x,e=myPs[s].p.y,h=F;const p=2*REST_L;let r=n*this.PRPA;for(let i=0;i<myPs.length;i++)if(!h&&!myPs[i].bIsABoundarySite&&-1==myPs[i].isOfStrc){let n=t-myPs[i].p.x,P=e-myPs[i].p.y;if(sqrt(n*n+P*P)<p){this.pIs.push(i),myPs[i].setIsPartOfStructure(this.id),myPs[i].mass=this.MASSMULT;let t=new Spring(myPs);t.setParticleIndicesAndRestLength(s,i,r,SPR_K),this.springs.push(t),h=T,this.lastAddSegmentTime=myFrmCnt}}}}else if(i>=0){let s=this.pIs[0],t=myPs[s].p.x,e=myPs[s].p.y,h=this.pIs[i],p=myPs[h].p.x,r=myPs[h].p.y,P=p-t,l=r-e,m=sqrt(P*P+l*l);if(m>0){let s=n*this.PRPA;P=P/m*s,l=l/m*s;let t=p+.2*P,e=r+.2*l;this.addInitialParticleAtLocation(t,e);let i=this.pIs[this.pIs.length-1],a=new Spring(myPs);a.setParticleIndicesAndRestLength(h,i,s,SPR_K),this.springs.push(a),this.lastAddSegmentTime=myFrmCnt}}}break; case ST5:{let s=this.pIs[0],e=myPs[s].p.x,i=myPs[s].p.y,n=this.PRPA,h=this.PRPB;const p=REST_L*pow(.875,h);for(let s=t-n;s<t;s++){let t=this.pIs[s],n=myPs[t].p.x,h=myPs[t].p.y,r=n-e,P=h-i,l=sqrt(r*r+P*P);r=r/l*p,P=P/l*p;let m=n+r,a=h+P;this.addInitialParticleAtLocation(m,a);let y=this.pIs[this.pIs.length-1],S=new Spring(myPs);S.setParticleIndicesAndRestLength(t,y,p,SPR_K),this.springs.push(S),this.lastAddSegmentTime=myFrmCnt}this.PRPB++}break; case ST1:case ST0:if(t<this.groSzLm){let e=PI*(maskR*BDM)*(maskR*BDM)/nInteriorPoints,i=1.15*(sqrt(3)*sqrt(e/(3*sqrt(3)/2))),n=i*i;if(this.bGreedy){let s=PINF,e=0,i=0;for(let h=0;h<t;h++){let t=this.pIs[h],p=myPs[t];for(let t=nMaskPoints;t<myPs.length;t++){let r=myPs[t];if(!r.bIsABoundarySite&&-1==r.isOfStrc){let P=p.p.x-r.p.x,l=p.p.y-r.p.y,m=P*P+l*l;m<n&&m<s&&(s=m,e=t,i=h)}}}e>0&&(this.insertExistingParticleIntoSpringChainAtIndex(i,e),this.lastAddSegmentTime=myFrmCnt)}else{let t=T;this.type==ST1?t=StSh.bGroAtKink:this.type==ST0&&(t=StSh.bLinesGrowAtHighestCurvature);let e=this.getIdOfKink(t);s=max(0,e),this.insertNewParticleIntoLoopStructureAtIndex(s),this.lastAddSegmentTime=myFrmCnt}}break; case ST4:if(t<this.groSzLm){let i=StSh.bGroAtKink,n=(s=((s=this.pIs[this.getIdOfKink(i)])+t)%t)%2==1?s-1:s,h=this.pIs[n%t],p=this.pIs[(n+1)%t],r=this.pIs[(n+2)%t],P=this.pIs[(n+3)%t],l=n/2*5+1;this.springs.splice(l,4);let m=myPs[h],a=myPs[p],y=myPs[r],S=myPs[P],I=(m.p.x+y.p.x)/2,g=(m.p.y+y.p.y)/2,o=(a.p.x+S.p.x)/2,c=(a.p.y+S.p.y)/2,d=new Particle,u=new Particle;d.set(I,g,this.MASSMULT),u.set(o,c,this.MASSMULT),d.setIsPartOfStructure(this.id),u.setIsPartOfStructure(this.id),myPs.push(d),myPs.push(u);let T=myPs.length-2,A=myPs.length-1;this.pIs.splice(n+2,0,T),this.pIs.splice(n+3,0,A),this.lastAddSegmentTime=myFrmCnt;const R=[[h,T],[p,A],[h,A],[T,p],[T,A],[T,r],[A,P],[T,P],[r,A]],f=[1,1,e,e,1,1,1,e,e];for(let s=0;s<R.length;s++){let t=new Spring(myPs),e=R[s][0],i=R[s][1];t.setParticleIndicesAndRestLength(e,i,REST_L*f[s],SPR_K),this.springs.splice(l,0,t),l++}}break; case ST3:if(s>=0&&s<t-2){let i=s%2==1?s-1:s,n=this.pIs[i+0],h=this.pIs[i+1],p=this.pIs[i+2],r=this.pIs[i+3],P=i/2*5+1;this.springs.splice(P,4);let l=myPs[n],m=myPs[h],a=myPs[p],y=myPs[r],S=(l.p.x+a.p.x)/2,I=(l.p.y+a.p.y)/2,g=(m.p.x+y.p.x)/2,o=(m.p.y+y.p.y)/2,c=new Particle,d=new Particle;c.set(S,I,this.MASSMULT),d.set(g,o,this.MASSMULT),c.setIsPartOfStructure(this.id),d.setIsPartOfStructure(this.id),myPs.push(c),myPs.push(d);let u=myPs.length-2,A=myPs.length-1;this.pIs.splice(i+2,0,u),this.pIs.splice(i+3,0,A),this.lastAddSegmentTime=myFrmCnt;const R=[[n,u],[h,A],[n,A],[u,h],[u,A],[u,p],[A,r],[u,r],[p,A]],f=[1,1,e,e,1,1,1,e,e];let L=StSh.trsTaper;for(let s=0;s<R.length;s++){let e=new Spring(myPs),i=R[s][0],n=R[s][1],h=L?map(t,10,this.groSzLm,.8,1.2,T):1;e.setParticleIndicesAndRestLength(i,n,h*REST_L*f[s],SPR_K),this.springs.splice(P,0,e),P++}}else{let s=.5,i=this.pIs[t-4],n=this.pIs[t-3],h=this.pIs[t-2],p=this.pIs[t-1],r=myPs[i],P=myPs[n],l=myPs[h],m=myPs[p],a=l.p.x+(l.p.x-r.p.x)*s,y=l.p.y+(l.p.y-r.p.y)*s,S=m.p.x+(m.p.x-P.p.x)*s,I=m.p.y+(m.p.y-P.p.y)*s,g=new Particle,o=new Particle;g.set(a,y,this.MASSMULT),o.set(S,I,this.MASSMULT),g.setIsPartOfStructure(this.id),o.setIsPartOfStructure(this.id),myPs.push(g),myPs.push(o);let c=myPs.length-2,d=myPs.length-1;this.pIs.push(c),this.pIs.push(d),this.lastAddSegmentTime=myFrmCnt;let u=[[h,c],[p,d],[h,d],[c,p],[c,d]],T=[1,1,e,e,1];for(let s=0;s<u.length;s++){let t=new Spring(myPs),e=u[s][0],i=u[s][1];t.setParticleIndicesAndRestLength(e,i,REST_L*T[s],SPR_K),this.springs.push(t)}}}} addSegmentClosestToLocation(t,e){let s=this.getGlobalIndexOfParticleClosestTo(t,e);if(s>=0){let t=this.pIs.length;for(let e=0;e<t;e++){if(this.pIs[e]==s){this.addSegment(e);break}}}} purgeInteriorParticles(){if(this.bLoop)for(let t=nMaskPoints;t<myPs.length;t++){let e=myPs[t];if(-1==e.isOfStrc){let s=e.p0.x,i=e.p0.y;if(this.pointInside(s,i)){let e=s-BDM/2,o=i-BDM/2,l=sqrt(e*e+o*o),n=50*e/l,r=50*o/l;myPs[t].addF(n,r,1),myPs[t].addF(n,r,2)}}}} applySmoothingForces(s){const t=this.pIs.length;let y,p;switch(this.type){default:break; case ST2:{const t=this.pIs[0],y=this.pIs[1];let p=myPs[t].v.x,e=myPs[t].v.y,m=(p+myPs[y].v.x)/2,i=(e+myPs[y].v.y)/2,P=m*m+i*i;if(P>0){P=Math.sqrt(P),m/=P,i/=P;let p=myPs[t].p.x,e=myPs[t].p.y,h=myPs[y].p.x-p,l=myPs[y].p.y-e,a=h*h+l*l;if(a>0){a=Math.sqrt(a),h/=a,l/=a;let p=m*l-i*h;if(Math.abs(p)>.1){let e=.2*p*l,m=.2*p*(0-h);myPs[t].addF(e,m,s),myPs[y].addF(-e,-m,s)}}}}break; case ST10:if(t>0){let s=this.PRPC,y=t/nMaskPoints,p=0;for(let t=0;t<y;t++){let e=map(t,0,y,1,s);for(let s=0;s<nMaskPoints;s++){let s=this.pIs[p];myPs[s].mass=e,p++}}}break; case ST6:if(T){let t=this.PRPB;if(t>0)for(let y=0;y<this.pIs.length;y++){let p=this.pIs[y],e=1==s?myPs[p].p0:myPs[p].pE;for(let m=0;m<y;m++){let y=this.pIs[m],i=1==s?myPs[y].p0:myPs[y].pE,P=i.x-e.x,h=i.y-e.y,l=P*P+h*h;if(l>.001){let e=P/l*t,m=h/l*t;myPs[y].addF(e,m,s),myPs[p].addF(-e,-m,s)}}}}break;