Draw from grid positions to some random position at large circle.
It's not perfect, but who like perfection anyway.
twitter.com/mknol
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1); // Global code will be evaluated once. const turtle = new Turtle(); const DENSITY = 25; // min=1 max=100, step=1 const RADIUS = 45; // min=1 max=100, step=1 const DOTS = 0.38; // min=0 max=1, step=0.001 const CENTER_X = 0; // min=-75 max=75, step=5 const CENTER_Y = 0; // min=-75 max=75, step=5 const center = [CENTER_X,CENTER_Y]; const r = RADIUS; const grid = DENSITY; const size = 90; // The walk function will be called until it returns false. function walk(i) { const x = i % grid; const y = i / grid | 0; const offset = (size * 2 / grid); if (i != 0 && i != grid - 1 && i != grid * grid - grid && i != grid * grid - 1) { // "rounded corner" const pos = [-size + x * offset, -size + y * offset]; const randomPos = add2(pos, [(Math.random() - 0.5) * r, (Math.random() - 0.5) * r]); const len = dist(randomPos, center); const endPos = add2(center, scale2(sub2(randomPos, center), 1 / len * r)); if (dist(center, pos) > r) { if (Math.random() < DOTS) { const circle = Math.random() + 0.5; turtle.jump(pos[0] , pos[1] - circle); turtle.circle(circle); } turtle.jump(pos[0], pos[1]); turtle.goto(endPos[0], endPos[1]); } } return i < grid * grid - 1; } // vec2 functions const scale2=(a,b)=>[a[0]*b,a[1]*b]; const add2=(a,b)=>[a[0]+b[0],a[1]+b[1]]; const sub2=(a,b)=>[a[0]-b[0],a[1]-b[1]]; const dot2=(a,b)=>a[0]*b[0]+a[1]*b[1]; const dist_sqr2=(a,b)=>(a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]); const dist=(a,b)=>Math.sqrt(dist_sqr2(a,b)); const angle=(a,b)=>Math.atan2(b[1]-a[1], b[0]-a[0]);