quick scrawl
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(1); const canvas_size = 95; // Global code will be evaluated once. const turtle = new Turtle(); class Vec2 { constructor(x, y) { this.x = x this.y = y } rotate(angle) { return new Vec2( this.x * Math.cos(angle) - this.y * Math.sin(angle), this.x * Math.sin(angle) + this.y * Math.cos(angle) ) } multn(n) { return new Vec2(this.x * n, this.y * n) } add(pt) { return new Vec2(this.x + pt.x, this.y + pt.y) } sub(pt) { return new Vec2(this.x - pt.x, this.y - pt.y) } index(size) { return Math.floor(this.x) + Math.floor(this.y) * size } equals(pt) { return this.x === pt.x && this.y === pt.y } distance(pt) { return Math.sqrt((this.x - pt.x) ** 2 + (this.y - pt.y) ** 2) } floor(pt) { return new Vec2(Math.floor(this.x), Math.floor(this.y)) } addX(x) { return new Vec2(this.x + x, this.y) } addY(y) { return new Vec2(this.x, this.y + y) } static lerp(a, b, fract) { return new Vec2(lerp(a.x, b.x, fract), lerp(a.y, b.y, fract)) } } function clamp(v, min, max) { return Math.max(Math.min(v, max), min) } function lerp(a, b, fract) { return a + (b - a) * fract } function opSmoothUnion( d1, d2, k ) { let h = clamp( 0.5 + 0.5*(d2-d1)/k, 0.0, 1.0 ); return lerp( d2, d1, h ) - k*h*(1.0-h); } function opSubtraction( d1, d2 ) { return Math.max(d1,d2); } function field(vv) { let core1 = new Vec2( -45, -45 ); let core2 = new Vec2( 45, -45 ); let core3 = new Vec2( -45, 45 ); let core4 = new Vec2( 45, 45 ); let merge = 110.0; let fl = opSmoothUnion( opSmoothUnion( vv.distance(core1), vv.distance(core2), merge ), opSmoothUnion( vv.distance(core3), vv.distance(core4), merge ), merge ); return fl; } // The walk function will be called until it returns false. function walk(i) { turtle.penup(); let yoff = -canvas_size + (i * 0.1); let op = ( Math.sin(yoff * 0.9 ) + 1.0 ) * 0.5; let oppow = Math.pow(op , 14); for (let xi=0; xi<canvas_size * 2; xi++) { let cp = new Vec2( -canvas_size + xi, yoff ); let dst = field(cp); if ( cp.distance(new Vec2(0,0)) < (op * 45 ) + (oppow*5) ) { continue; } turtle.goto(cp.x, cp.y); if ( op > 0.32 && dst < 12 + (oppow * 32) ) { turtle.pendown(); turtle.forward(1); turtle.penup(); } } /* if (i <= 10) { let rad = 5; let ix = i * 0.1; turtle.penup(); turtle.goto(0, 0 + ( -rad-ix) ); turtle.pendown(); turtle.circle(rad+ix, 360); turtle.penup(); }*/ return i < canvas_size * 20; }