Hexagonadomegaly

It could happen to you.

Created by maraz on 2019/1/6
36
0

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;
}