I can see what you do in the shadows
Log in to post a comment.
Canvas.setpenopacity(-0.2);
const t = new Turtle();
const alpha = 0.15
const mind = 0.5
function subdivide(x1, y1, x2, y2) {
let dx = x2 - x1, dy = y2 - y1
let cx = (x1 + x2) / 2, cy = (y1 + y2) / 2
let a = alpha * (Math.random() * 2 - 1)
return [cx + a * dy, cy - a * dx]
}
function draw(x1, y1, x2, y2) {
if ((x1 - x2)**2 + (y1 - y2)**2 < mind**2) {
t.jump(x1, y1)
t.goto(x2, y2)
}
else {
[nx, ny] = subdivide(x1, y1, x2, y2)
draw(x1, y1, nx, ny)
draw(nx, ny, x2, y2)
}
}
const R1 = 20, R2 = 45
const dphi = Math.PI / 101 / 3
let shift = R2 / 2
for (let phi = 0; phi < 2 * Math.PI; phi += dphi) {
draw(R1 * Math.cos(phi) - 50, R1 * Math.sin(phi) - shift, R2 * Math.cos(phi) - 50, R2 * Math.sin(phi) - shift)
}
for (let phi = 0; phi < 2 * Math.PI; phi += dphi) {
draw(R1 * Math.cos(phi) + 50, R1 * Math.sin(phi) - shift, R2 * Math.cos(phi) + 50, R2 * Math.sin(phi) - shift)
}
const R3 = 1.8 * R2, R4 = 0.5 * R2
let cy = 100 - (100 - R2) / 2
for (let phi = 0; phi < 2 * Math.PI; phi += dphi / 2) {
draw(0, cy - shift, R3 * Math.cos(phi), cy + R4 * Math.sin(phi) - shift)
}
const R5 = R1 / 5
for (let phi = 0; phi < 2 * Math.PI; phi += dphi * 16) {
t.jump(-2 * R5 + R5 * Math.cos(phi), 0.8 * R2 - shift + R5 * Math.sin(phi))
t.goto(-2 * R5 + (R5 + 1) * Math.cos(phi), 0.8 * R2 - shift + (R5 + 1) * Math.sin(phi))
t.jump(2 * R5 + R5 * Math.cos(phi), 0.8 * R2 - shift + R5 * Math.sin(phi))
t.goto(2 * R5 + (R5 + 1) * Math.cos(phi), 0.8 * R2 - shift + (R5 + 1) * Math.sin(phi))
}
/*const R6 = 110, R7 = 150
for (let phi = 0; phi < 2 * Math.PI; phi += dphi * 4) {
draw(R6 * Math.cos(phi), R6 * Math.sin(phi), R7 * Math.cos(phi), R7 * Math.sin(phi))
}*/