Play with x_rand and y_rand to create non-random patterns.
Log in to post a comment.
// LL 2021 Canvas.setpenopacity(1); const grid_size = 50; // min=1 max=200 step=1 const precision = 5; // min=1 max=10 step=1 const x_rand = 0; // min=0 max=1000 step=1 const y_rand = 0; // min=0 max=1000 step=1 const rotation = 1; // min=0 max=1 step=1 const line_count = 5; // min=1 max=29 step=2 const draw_bounds = 0; // min=0 max=1 step=1 (No,Yes) const seed = 0; // min=0 max=100 step=1 const canvas_size = 300; const grid_step = canvas_size / grid_size; const turtle = new Turtle(); var tiles; function walk(i) { if (i==0) { initTiles(); } if (tiles.length > 0) { const tile = tiles.shift(); tile.draw(); } return tiles.length > 0; } function initTiles() { tiles = []; for (var y=0; y<grid_size; y++) { for (var x=0; x<grid_size; x++) { const o = random(x, y); tiles.push(new Tile(x, y, o)); } } } class Tile { constructor(x, y, orientation) { this.orientation = orientation; this.x = x; this.y = y; } draw() { const angle = Math.floor(this.orientation * 2) * Math.PI / 2 + Math.PI / 4; const r = rotation * Math.PI / 4; const cx = -canvas_size / 2 + this.x * grid_step + grid_step / 2; const cy = -canvas_size / 2 + this.y * grid_step + grid_step / 2; const dx = rotX(cx, cy, r); const dy = rotY(cx, cy, r); if (draw_bounds) { const dr = grid_step / Math.sqrt(2); turtle.up(); for (var s=0.5; s<=4.5; s++) { turtle.goto(dx + Math.cos(r + s * Math.PI/2) * dr, dy + Math.sin(r + s * Math.PI/2) * dr); turtle.down(); } } const count = Math.floor(line_count / 2); for (var o=-count; o<=count; o++) { const ro = grid_step / 2 * (1 + o / 10); for (var s=0; s<2; s++) { const ox = dx + Math.cos(angle + r + s * Math.PI) * grid_step / Math.sqrt(2); const oy = dy + Math.sin(angle + r + s * Math.PI) * grid_step / Math.sqrt(2); turtle.up(); const step = Math.PI/2 / precision; for (var a=0; a<Math.PI/2+step/2; a+=step) { const bx = ox + Math.cos(a + r + angle + s * Math.PI + 3 * Math.PI / 4) * ro; const by = oy + Math.sin(a + r + angle + s * Math.PI + 3 * Math.PI / 4) * ro; turtle.goto(bx, by); turtle.down(); } } } } } function rotX(x, y, a) { return Math.cos(a) * x - Math.sin(a) * y; } function rotY(x, y, a) { return Math.sin(a) * x + Math.cos(a) * y; } var rng; function random(x, y) { if (x_rand > 0 || y_rand > 0) { return ((seed+1) * (x * x_rand + y * y_rand)) / 1000; } if (seed == 0) return Math.random(); rng = new RNG(seed + x + y * 1000); for (var skip=0; skip < 100; skip++) rng.nextFloat(); return rng.nextFloat(); } // Random with seed function RNG(t){return new class{constructor(t){this.m=2147483648,this.a=1103515245,this.c=12345,this.state=t||Math.floor(Math.random()*(this.m-1))}nextFloat(){return this.state=(this.a*this.state+this.c)%this.m,this.state/(this.m-1)}}(t)}