ipfs://bafybeie4oc7oabjov37ys3vp7sbkfbk5ixdatgealgxdvcnm6bdvajgfmqlet circleRadius,timeOffset=0,res=2;
function setup(){
let s=min(windowWidth,windowHeight);
createCanvas(s,s);
colorMode(HSB,360,100,100);
circleRadius=width*0.4;
noStroke();
}
function windowResized(){
let s=min(windowWidth,windowHeight);
resizeCanvas(s,s);
circleRadius=width*0.4;
}
function draw(){
if(frameCount<2){background(0);return;}
background(0);
timeOffset+=0.015;
push();
translate(width/2,height/2);
let t1=timeOffset*0.3,t2=timeOffset*0.2,t3=timeOffset*0.4,t4=timeOffset*0.5,t5=timeOffset*0.6;
let hue=(timeOffset*100)%360,ns=0.01,off=res*0.7,lf=15;
for(let y=-circleRadius;y<=circleRadius;y+=res){
for(let x=-circleRadius;x<=circleRadius;x+=res){
let d=sqrt(x*x+y*y);
if(d>circleRadius)continue;
let r1x=x*0.7-y*0.7,r1y=x*0.7+y*0.7,r2x=-x*0.5+y*0.866,r2y=-x*0.866-y*0.5;
let n1=noise(x*ns+t1,y*ns+t2,t3),n2=noise(r1x*ns*1.3+t3,r1y*ns*1.3+t2,t4),n3=noise(r2x*ns*1.7+t4,r2y*ns*1.7+t3,t5);
let c=n1*0.5+n2*0.3+n3*0.2;
let nb1=noise((x+off)*ns+t1,y*ns+t2,t3),nb2=noise((r1x+off*0.7)*ns*1.3+t3,r1y*ns*1.3+t2,t4),nb3=noise((r2x+off*0.5)*ns*1.7+t4,r2y*ns*1.7+t3,t5);
let nc=nb1*0.5+nb2*0.3+nb3*0.2;
let m=(c*lf)%1,tl=m<0.025||m>0.975,g=abs(c-nc),gl=g>0.05&&g<0.1;
if(tl||gl){
let r=d/circleRadius,sat=map(r,0,1,100,20),br=r<0.67?map(r,0,0.67,95,70):map(pow((r-0.67)/0.33,2.5),0,1,70,0);
fill(hue,sat,br);
rect(x,y,res,res);
}
}
}
pop();
}
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);
}
Algorithmic De StijlAnimated onchain script inspired by the De Stijl principles and work of Piet Mondrian, with the additional use of Fibonacci proportions. A new composition forms each second — click to freeze.
Gray HoodsAn on-chain generative portrait engine with virtually infinite variation, crafted with a minimal aesthetic. A new Gray Hood is randomly generated each second, purely with code — each defined by its own unique mix of shape, proportion, facial features, monogrammed initials, background variants, and a few rare traits. This is not a profile pic — this is a profile engine.
OpePaintA tool for everyone. View random generations or create your own using the language and framework of Opepen. Instructions: Random generations are provided as a start. To begin, click the canvas to freeze the image. Click again to add/change figure cells (each click cycles through options). KEYBOARD COMMANDS: H + Arrows - Adjust Hue of all figure cells. S + Arrows - Adjust Saturation. L + Arrows - Adjust Lightness. V + H/S/L + Arrows - Adjust H/S/L of individual cells (hover mouse over cell to specify). A + H/S/L + Arrows - Adjust Background. Z + Click - Toggle Outlines. Q + Click - Restart. All 64 cells are available to change. Canvas scales per the window. Right-Click-Save as desired.
Perfect MazeAn on-chain generative script utilizing the Hunt and Kill maze generation technique combined with Depth-First Search—to create a perfect maze with no loops or inaccessible areas. Click three times to reveal the solution, then click again to generate a brand-new maze. The maze dynamically adjusts its size based on your window dimensions.
Hue WiperOn-Chain P5.js script responding to the Genuary 16 prompt \"Generative Palette\". Hues are randomly generated with each wipe. Several other subtle random variables. Click for new random width configuation of 50 bars. Canvas expands to window size.