memoscan
← all memos

Memo 0x327c0615…6e10e2 on Ethereum

ipfs://bafkreihftlgwc2miemmkrxulvsel2w7ccwnn53on5p2hikh6c2kvwgqgaulet digits=[]; let groundDigits=[]; let moonDigits=[]; let canvasSize=0; let moonX=0; let moonY=0; let moonRadius=0; let digitsPerFrame=144; let walkCycle=0; let walkSpeed=0.05; let groundOffset=0; let groundSpeed=3; let bodyParts={head:{x:0,y:0,radius:0},torso:{x:0,y:0,width:0,height:0},frontArm:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},backArm:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},frontLeg:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},backLeg:{x1:0,y1:0,x2:0,y2:0,x3:0,y3:0},hips:{x:0,y:0,width:0}}; function setup(){ canvasSize=min(windowWidth,windowHeight); createCanvas(canvasSize,canvasSize); background(0); textAlign(CENTER,CENTER); moonX=width*0.12; moonY=height*0.1; moonRadius=canvasSize*0.05; initGround(); initMoon(); } function initMoon(){ let sc=canvasSize/600; let tiltAngle=radians(-15); let innerRadius=moonRadius*0.95; let offsetDist=moonRadius*0.3; for(let i=0;i<375;i++){ let angle=random(TWO_PI); let r=sqrt(random())*moonRadius; let x=moonX+cos(angle)*r; let y=moonY+sin(angle)*r; let innerCircleX=moonX+cos(tiltAngle)*offsetDist; let innerCircleY=moonY+sin(tiltAngle)*offsetDist; let distFromInner=dist(x,y,innerCircleX,innerCircleY); if(distFromInner>innerRadius){ moonDigits.push({x:x,y:y,size:random(3,6)*sc,digit:floor(random(10)),rotation:random(TWO_PI)}); } } } function getGroundY(x){ return lerp(height*0.5,height,x/width); } function initGround(){ let sc=canvasSize/600; for(let i=0;i<80;i++){ let x=random(width); let baseY=getGroundY(x); let groundDepth=lerp(height*0.5,0,x/width); let yOffset=random()*random()*groundDepth; if(baseY+yOffset<=height){ groundDigits.push({x:x,y:baseY+yOffset,size:random(4,8)*sc,digit:floor(random(10)),rotation:random(TWO_PI)}); } } } function updateBodyParts(){ let sc=canvasSize/600; let ms=sc*0.6; let centerX=width*0.7; let baseY=getGroundY(centerX); let legPhase=sin(walkCycle); let armPhase=sin(walkCycle+PI); let bodyBob=abs(sin(walkCycle*2))*6*ms; let leanAngle=radians(10); let hipY=baseY-210*ms-bodyBob*0.5; bodyParts.hips={x:centerX,y:hipY,width:20*ms}; let torsoLength=110*ms; let headOffset=150*ms; let shoulderX=centerX-sin(leanAngle)*torsoLength; let shoulderY=hipY-cos(leanAngle)*torsoLength-bodyBob; bodyParts.torso={x:centerX-sin(leanAngle)*(torsoLength*0.5),y:hipY-cos(leanAngle)*(torsoLength*0.5)-bodyBob,width:25*ms,height:70*ms,shoulderY:shoulderY}; bodyParts.head={x:centerX-sin(leanAngle)*headOffset,y:hipY-cos(leanAngle)*headOffset-bodyBob,radius:20*ms}; let frontLegSwing=legPhase; let frontKneeX=centerX-frontLegSwing*60*ms; let frontKneeY=hipY+100*ms; if(frontLegSwing>0)frontKneeY=hipY+90*ms; let frontFootX=frontKneeX-max(0,frontLegSwing)*30*ms; let frontFootGroundY=getGroundY(frontFootX); let frontFootY=frontFootGroundY; if(frontLegSwing>0.3)frontFootY=frontFootGroundY-(frontLegSwing-0.3)*40*ms; bodyParts.frontLeg={x1:centerX,y1:hipY,x2:frontKneeX,y2:frontKneeY,x3:frontFootX,y3:frontFootY,thickness:7*ms}; let backLegSwing=-legPhase; let backKneeX=centerX-backLegSwing*60*ms; let backKneeY=hipY+100*ms; if(backLegSwing>0)backKneeY=hipY+90*ms; let backFootX=backKneeX-max(0,backLegSwing)*30*ms; let backFootGroundY=getGroundY(backFootX); let backFootY=backFootGroundY; if(backLegSwing>0.3)backFootY=backFootGroundY-(backLegSwing-0.3)*40*ms; bodyParts.backLeg={x1:centerX,y1:hipY,x2:backKneeX,y2:backKneeY,x3:backFootX,y3:backFootY,thickness:6*ms}; let upperArmLength=75*ms; let forearmLength=68*ms; let leftRotation=map(armPhase,-1,1,HALF_PI*0.9,-HALF_PI*0.9); let leftUpperAngle=HALF_PI+leftRotation; let leftForearmAngle=PI+leftRotation; let leftElbowX=centerX+cos(leftUpperAngle)*upperArmLength; let leftElbowY=shoulderY+sin(leftUpperAngle)*upperArmLength; let leftHandX=leftElbowX+cos(leftForearmAngle)*forearmLength; let leftHandY=leftElbowY+sin(leftForearmAngle)*forearmLength; let rightRotation=map(-armPhase,-1,1,HALF_PI*0.9,-HALF_PI*0.9); let rightUpperAngle=HALF_PI+rightRotation; let rightForearmAngle=PI+rightRotation; let rightElbowX=centerX+cos(rightUpperAngle)*upperArmLength; let rightElbowY=shoulderY+sin(rightUpperAngle)*upperArmLength; let rightHandX=rightElbowX+cos(rightForearmAngle)*forearmLength; let rightHandY=rightElbowY+sin(rightForearmAngle)*forearmLength; if(leftElbowX<rightElbowX){ bodyParts.frontArm={x1:centerX,y1:shoulderY,x2:leftElbowX,y2:leftElbowY,x3:leftHandX,y3:leftHandY,thickness:6*ms,fistSize:5*ms}; bodyParts.backArm={x1:centerX,y1:shoulderY,x2:rightElbowX,y2:rightElbowY,x3:rightHandX,y3:rightHandY,thickness:5*ms,fistSize:4*ms}; }else{ bodyParts.frontArm={x1:centerX,y1:shoulderY,x2:rightElbowX,y2:rightElbowY,x3:rightHandX,y3:rightHandY,thickness:6*ms,fistSize:5*ms}; bodyParts.backArm={x1:centerX,y1:shoulderY,x2:leftElbowX,y2:leftElbowY,x3:leftHandX,y3:leftHandY,thickness:5*ms,fistSize:4*ms}; } } function isInsideBody(px,py){ let sc=canvasSize/600; let head=bodyParts.head; if(dist(px,py,head.x,head.y)<head.radius)return true; let torso=bodyParts.torso; let dx=(px-torso.x)/torso.width; let dy=(py-torso.y)/torso.height; if(dx*dx+dy*dy<1)return true; let hips=bodyParts.hips; if(dist(px,py,hips.x,hips.y)<hips.width*0.8)return true; if(isNearLimb(px,py,bodyParts.backArm))return true; if(isNearLimb(px,py,bodyParts.backLeg))return true; if(isNearLimb(px,py,bodyParts.frontArm))return true; if(isNearLimb(px,py,bodyParts.frontLeg))return true; let neckX=bodyParts.head.x; let neckY=bodyParts.head.y+head.radius*0.8; if(dist(px,py,neckX,neckY)<10*sc)return true; return false; } function isNearLimb(px,py,limb){ let d1=distToSegment(px,py,limb.x1,limb.y1,limb.x2,limb.y2); let d2=distToSegment(px,py,limb.x2,limb.y2,limb.x3,limb.y3); let t=limb.thickness; let inLimb=d1<t||d2<t*0.8; if(limb.fistSize){ let dFist=dist(px,py,limb.x3,limb.y3); if(dFist<limb.fistSize)return true; } return inLimb; } function distToSegment(px,py,x1,y1,x2,y2){ let dx=x2-x1; let dy=y2-y1; let len2=dx*dx+dy*dy; if(len2===0)return dist(px,py,x1,y1); let t=max(0,min(1,((px-x1)*dx+(py-y1)*dy)/len2)); return dist(px,py,x1+t*dx,y1+t*dy); } function draw(){ background(0); let sc=canvasSize/600; walkCycle+=walkSpeed; groundOffset+=groundSpeed; updateBodyParts(); let slopeRatio=(height*0.5)/width; let keepGround=[]; for(let i=0;i<groundDigits.length;i++){ let d=groundDigits[i]; d.x+=groundSpeed; d.y+=groundSpeed*slopeRatio; if(random()>=0.02&&d.x<=width+20&&d.y<=height+20)keepGround.push(d); } groundDigits=keepGround; let maxGround=800; if(groundDigits.length>maxGround)groundDigits=groundDigits.slice(-maxGround); let groundDepthAtLeft=height*0.5; if(groundDigits.length<maxGround){ for(let g=0;g<4;g++){ if(random()<0.8){ let baseY=getGroundY(0); let yOffset=random()*random()*groundDepthAtLeft; groundDigits.push({x:0,y:baseY+yOffset,size:random(4,8)*sc,digit:floor(random(10)),rotation:random(TWO_PI)}); } } for(let g=0;g<4;g++){ if(random()<0.3){ let x=random(width); let baseY=getGroundY(x); let groundDepth=lerp(height*0.5,0,x/width); if(groundDepth>10){ let yOffset=random()*random()*groundDepth; groundDigits.push({x:x,y:baseY+yOffset,size:random(4,8)*sc,digit:floor(random(10)),rotation:random(TWO_PI)}); } } } } moonDigits=moonDigits.filter(()=>random()>=0.02); let tiltAngle=radians(-15); let innerRadius=moonRadius*0.95; let offsetDist=moonRadius*0.3; while(moonDigits.length<32){ let angle=random(TWO_PI); let r=sqrt(random())*moonRadius; let x=moonX+cos(angle)*r; let y=moonY+sin(angle)*r; let innerCircleX=moonX+cos(tiltAngle)*offsetDist; let innerCircleY=moonY+sin(tiltAngle)*offsetDist; let distFromInner=dist(x,y,innerCircleX,innerCircleY); if(distFromInner>innerRadius){ moonDigits.push({x:x,y:y,size:random(3,6)*sc,digit:floor(random(10)),rotation:random(TWO_PI)}); } } digits=digits.filter(()=>random()>=0.05); let ms=sc*0.6; let manCenterX=width*0.7; let manCenterY=getGroundY(manCenterX)-180*ms; for(let i=0;i<digitsPerFrame;i++){ let px=manCenterX+random(-120*ms,120*ms); let py=manCenterY+random(-220*ms,220*ms); if(isInsideBody(px,py)){ digits.push({x:px,y:py,size:random(2,6)*ms,digit:floor(random(10)),rotation:random(TWO_PI)}); } } if(digits.length>4000)digits=digits.slice(-4000); noStroke(); fill(255); for(let d of moonDigits){push();translate(d.x,d.y);rotate(d.rotation);textSize(d.size);text(d.digit,0,0);pop();} for(let d of groundDigits){push();translate(d.x,d.y);rotate(d.rotation);textSize(d.size);text(d.digit,0,0);pop();} for(let d of digits){push();translate(d.x,d.y);rotate(d.rotation);textSize(d.size);text(d.digit,0,0);pop();} } function windowResized(){ canvasSize=min(windowWidth,windowHeight); resizeCanvas(canvasSize,canvasSize); moonX=width*0.12; moonY=height*0.1; moonRadius=canvasSize*0.05; digits=[]; groundDigits=[]; moonDigits=[]; initGround(); initMoon(); background(0); }