It could happen to you.
Log in to post a comment.
Canvas.setpenopacity(-0.5); const iters = 15000; const size = 5; let primes = [3, 5, 7, 11, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]; const getPrime = () => primes.splice(Math.floor(Math.random()*primes.length), 1)[0]; const a = getPrime(); const b = getPrime(); const extent = 100; let visited = []; let free = []; const visit = (point) => visited.push([...point]) && free.push([...point]); const alreadyVisited = (point) => visited.find((op) => Math.round(op[0]) === Math.round(point[0]) && Math.round(op[1]) === Math.round(point[1])); Turtle.prototype.checkBounds = function() { this.penup(); const x = this.x(); const y = this.y(); if (x > extent) this.setx(-extent+(x-extent)); else if (x < -extent) this.setx(extent-(-1*(x+extent))); if (y > extent) this.sety(-extent+(y-extent)); else if (y < -extent) this.sety(extent-(-1*(y+extent))); this.pendown(); } Turtle.prototype.testPoint = function() { const x = this.x(); const y = this.y(); return !alreadyVisited([x, y]); } Turtle.prototype.freeDir = function(recurse) { let dir = 1; this.penup(); do { this.right(dir*60); this.forward(size); point = this.testPoint(); if (!recurse && !this.freeDir(true)) { this.pendown(); } this.backward(size); this.penup(); this.left(dir*60); dir++; } while (!point && dir <= 6) return point ? dir*60 : false; } const turtle = new Turtle(); turtle.penup(); turtle.goto(0, 0); turtle.pendown(); function walk(i) { turtle.penup(); const ia = a+Math.floor(i/a); const ib = b+Math.floor(i/b); if (i%ia==0) turtle.left(60); if (i%ib==0) turtle.right(60); if ((i%ia==0 && i%ib==0) || (i%a==0 && i%b==0)) turtle.right(60); else if ((i%ia && i%ib) && (i%a && i%b)) turtle.left(60); turtle.forward(size); turtle.checkBounds(); const x = turtle.x(); const y = turtle.y(); if (!alreadyVisited([x, y])) { turtle.backward(size); turtle.pendown(); turtle.forward(size); visit([x, y]); } else { for (let p = 1; p < free.length-1; p++) { const last = free[(free.length-p-1)%free.length-1]; turtle.penup(); turtle.goto([...last]); const dir = turtle.freeDir(); if (dir !== false) { turtle.right(dir); turtle.pendown(); turtle.forward(size); break; } else { free = free.splice(free.length-p-1, 1); } } } return i < iters; }