An approach to wrap a line though all 'pixels' of an n-th order Hibert space: a Hilbert curve
en.wikipedia.org/wiki/hilbert_curve
youtube.com/watch?v=3s7h2mhqtxc
Edit: turtletoy.net/user/ksons implementation: Hilbert Curve
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(.7); // Global code will be evaluated once. const turtle = new Turtle(); let order = 6; // min=1, max=10, step=1 let size = 180; // min=50, max=200, step=10 turtle.penup(); //turtle.goto(-50, 50); //turtle.pendown(); function HilbertSpace(x, y, width, height, type, first = true) { this.x = x; this.y = y; this.w = width; this.h = height; this.t = type; this.split = []; this.first = first; } HilbertSpace.A = 1; HilbertSpace.B = 2; HilbertSpace.C = 3; HilbertSpace.D = 4; HilbertSpace.prototype.draw = function(i) { if(this.split.length == 0) { switch(this.t) { case HilbertSpace.A: turtle.goto(this.x - (this.w / 4), this.y + (this.h / 4)); turtle.pendown(); turtle.goto(this.x - (this.w / 4), this.y - (this.h / 4)); turtle.goto(this.x + (this.w / 4), this.y - (this.h / 4)); turtle.goto(this.x + (this.w / 4), this.y + (this.h / 4)); break; case HilbertSpace.B: turtle.goto(this.x + (this.w / 4), this.y - (this.h / 4)); turtle.pendown(); turtle.goto(this.x - (this.w / 4), this.y - (this.h / 4)); turtle.goto(this.x - (this.w / 4), this.y + (this.h / 4)); turtle.goto(this.x + (this.w / 4), this.y + (this.h / 4)); break; case HilbertSpace.C: turtle.goto(this.x + (this.w / 4), this.y - (this.h / 4)); turtle.pendown(); turtle.goto(this.x + (this.w / 4), this.y + (this.h / 4)); turtle.goto(this.x - (this.w / 4), this.y + (this.h / 4)); turtle.goto(this.x - (this.w / 4), this.y - (this.h / 4)); break; case HilbertSpace.D: turtle.goto(this.x - (this.w / 4), this.y + (this.h / 4)); turtle.pendown(); turtle.goto(this.x + (this.w / 4), this.y + (this.h / 4)); turtle.goto(this.x + (this.w / 4), this.y - (this.h / 4)); turtle.goto(this.x - (this.w / 4), this.y - (this.h / 4)); break; } return; } this.split.forEach(p => p.draw()); } HilbertSpace.prototype.nextOrder = function(level = 1) { if(level == 1) { return } if(this.split.length == 0) { switch(this.t) { case HilbertSpace.A: this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.D, this.first) ); this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.A, false) ); this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.A, false) ); this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.B, false) ); break; case HilbertSpace.B: this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.C, this.first) ); this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.B, false) ); this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.B, false) ); this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.A, false) ); break; case HilbertSpace.C: this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.B, this.first) ); this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.C, false) ); this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.C, false) ); this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.D, false) ); break; case HilbertSpace.D: this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.A, this.first) ); this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y + (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.D, false) ); this.split.push( new HilbertSpace(this.x + (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.D, false) ); this.split.push( new HilbertSpace(this.x - (this.w / 4), this.y - (this.h / 4), this.w / 2, this.h / 2, HilbertSpace.C, false) ); break; } this.first = false; } this.split.forEach(p => p.nextOrder(level - 1)); } var hc = new HilbertSpace(0, 0, size, size, HilbertSpace.A); hc.nextOrder(order); //hc.draw(); // The walk function will be called until it returns false. function walk(i) { hc.draw(i); return false; }