A collection spirographs (en.wikipedia.org/wiki/spirograph)
#spirograph
Log in to post a comment.
// Spirographs. Created by Reinder Nijhoff 2019 // @reindernijhoff // https://turtletoy.net/turtle/d07d0009b3 const drawRadius = 5; // min=3 max=8 step=1 const drawDistance = 12; //min=5 max=20 step=1 const grid = 16; // min=6 max=20 step=1 const drawSteps = 500; const spirographs = []; const gcd = (x, y) => { x = Math.abs(x), y = Math.abs(y); while(y) { const t = y; y = x % y; x = t; } return x; } class spirograph { constructor(x, y, radius) { this.x = (x-grid/2+.5)*drawDistance; this.y = (y-grid/2+.5)*drawDistance; // this.r0 = (.2 + .6 * x/100 ) * drawRadius; this.r0 = (0.2 + 0.6 * Math.random()) * drawRadius; this.r1 = drawRadius - this.r0; this.f0 = x + 1; this.f1 = -(y + 1); this.turtle = new Turtle(this.p(0)); this.steps = drawSteps / gcd(this.f0, this.f1) + 1; } p(step) { const time = step / drawSteps * Math.PI * 2; return [ this.x + this.r0*Math.sin(this.f0*time) + this.r1*Math.sin(this.f1*time), this.y + this.r0*Math.cos(this.f0*time) + this.r1*Math.cos(this.f1*time) ]; } draw(step) { if (step > this.steps) { return false; } else { this.turtle.goto(this.p(step)); return true; } } } for (let x=0; x<grid; x++) { for (let y=0; y<grid; y++) { spirographs.push(new spirograph(x,y)); } } function walk(i) { let ret = false; spirographs.forEach( s => { ret = s.draw(i) || ret; }); return ret; }