Full version on fxhash fxhash.xyz/generative/10684
Inspired by dwitter.net/d/23968 by @KilledByAPixel
Log in to post a comment.
const turtle = new Turtle(); const total = 20;// min=10, max=40, step=1 const camera = 45; // min=0, max=90, step=15 const order = 5; // min=0, max=30, step=1 const height = 60; // min=20, max=100, step=1 const width = 50; // min=10, max=100, step=1 const diffuse = 15; // min=5, max=30, step=1 const reflect = 0.75; // min=0, max=1, step=0.05 const water = 30; // min=0, max=100, step=1 const sun = 6; // min=0, max=20, step=2 const density = 0.84; // min=0, max=1, step=0.01 const seed = 777; function walk(i, frame) { if (i == 0) rseed = seed; let h = height * 0.15 + height; const t = (i-0.2+rand()*0.4) / total; //0-1 let x = -100 + t * 200; const t2 = x/100; // -1 - 1 const t2abs = Math.abs(t2); if (i === 0) { if (sun) { turtle.jump(0, camera - 30 - sun * 4); turtle.circle(sun) } for (let k=0;k<water;k++) { if (rand() > 0.25) { drawLine( -100, 1 + camera + 100 * (Math.pow(k/water,6)), 200, 0.25 ); } } } x += -order/2 + rand() *order; const threeHeight = h + rand() * 17; const j2 = Math.max(t2abs * (2.0 - t2abs) * threeHeight, 10); for(let j=0; j<j2;j+=lrp(0.1, 0.85, density)) { const t3 = 1-(j/j2); let w = t3*t3 * width * (0.15+Math.abs(-0.5+t)); w += rand()*diffuse*t3; const h = Math.max(1, 2 * Math.abs(t2)); drawRect( x - w/2, camera + -j*2 - h, w, h ); if (rand() < t3 * reflect) { w *= 0.8 + rand() * 0.2; drawRect( x - w/2, camera + 1.6 + j*2 + h * 0.5, w, h * 0.5 ); } } return i < total; } function lrp(a,b,f) { return a*f + b*(1-f); } function pingpong(t) { return (t > 0.5 ? 1 - t : t) * 2; } function drawRect(x,y,w,h) { turtle.jump(x,y); turtle.goto(x+w,y); turtle.goto(x+w,y+h); turtle.goto(x,y+h); turtle.goto(x,y) } function drawLine(x,y,w,h) { turtle.jump(x,y); turtle.goto(x+w,y); } // pseudo random methods function hash(p) { p += seed; p = 1103515245 * (((p) >> 1) ^ (p)); p = 1103515245 * (p ^ (p>>3)); p = p ^ (p >> 16); return p / 1103515245 % 1; } let rseed = seed; function rand() { let r = 1103515245 * (((rseed) >> 1) ^ (rseed++)); r = 1103515245 * (r ^ (r>>3)); r = r ^ (r >> 16); return r / 1103515245 % 1; }