Like Prime Directive but with separate rules for turning left/right and going forward.
Log in to post a comment.
Canvas.setpenopacity(0.5);
const size = 1;
const steps = 2;
const extent = 100;
const start = [0, 0];
const primes = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41];
const mode = -1+2*Math.round(Math.random());
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.decideDirection = function(step) {
const left = this.factors.reduce((a, f, idx) => !a && !(step%f), false);
const right = this.factors.reduce((a, f, idx) => a || step%f==0, false);
if (left && right) return 4*mode;
if (left) return -1*mode;
if (right) return mode;
return false;
}
Turtle.prototype.chooseFactors = function(factors) {
const n = 3+Math.floor(1*Math.random());
this.factors = [];
for (let i = 0; i < n; i++) {
this.factors.push(factors.splice(Math.floor(Math.random()*factors.length), 1));
}
}
const turtle = new Turtle();
turtle.penup();
turtle.goto(start[0], start[1]);
turtle.chooseFactors(primes);
turtle.end = turtle.factors.reduce((a, f) => a*f, 4)-1;
turtle.pendown();
function walk(i) {
const dir = turtle.decideDirection(i);
if (dir) turtle.circle(dir*size, 90, steps);
else turtle.forward(size);
turtle.checkBounds();
return i < turtle.end;
}