an attempt to draw a buddhabrot without bunching points into pixels.
Slightly less 'haze' by ignoring the first few points generated by Mandelbrot iterations.
Log in to post a comment.
// You can find the Turtle API reference here: https://turtletoy.net/syntax Canvas.setpenopacity(0.25); // these are separated so that you can place more points per redraw. // I am using a discrete sampling rather than a random one but maybe that's not a great idea? // I like determinism in images though const sqrt_iters = 3; const lattice_size = 450; const iters = sqrt_iters ** 2; const nmax = 200; function iterate(x0, y0, out){ let x = x0, y = y0, limit = 2*nmax; for (let i = 0; i < limit; i += 2) { const xnew = x * x - y * y + x0; const ynew = 2 * x * y + y0; out[i] = x = xnew; out[i+1] = y = ynew; if (x*x + y*y > 10) { return i + 2; } } return -1; } const zoom_x = 300; const zoom_y = 300; const turtle = new Turtle(); // The walk function will be called until it returns false. turtle.penup(); const grid = []; for (let i = 0; i < lattice_size; i++) { for (let j = 0; j < lattice_size; j++) { grid.push(i/lattice_size - 0.5, j/lattice_size - 0.5); } } function walk(k) { if (k >= iters) { return false; } const i = k % sqrt_iters; const j = (k - i) / sqrt_iters; // we want to uniformly sample the box 0 < x,y < 1/lattice_size, // preferably not lining up on either edge. So first we transform {0, 1, 2, 3} to {0.5, 1.5, 2.5, 3.5} // and then we divide to {0.125, 0.375, 0.625, 0.875} and then we use this grid on [0, 1]^2 to hit // the smaller space. Then we shift to -0.5 so that this is not going to uniformly sample const offset_x = ((i + 0.5) / sqrt_iters)/lattice_size; const offset_y = ((j + 0.5) / sqrt_iters)/lattice_size; for (let n = 0; n < grid.length; n += 2) { const x = 4*(grid[n] + offset_x); const y = 4*(grid[n + 1] + offset_y); const vals = []; const len = iterate(x, y, vals); for (let i = 4; i < len; i += 2) { const ix = 0.3 * zoom_x * (vals[i] + 0.5); const iy = 0.3 * zoom_y * vals[i+1]; if (Math.max(ix, iy) < -100 || Math.min(ix, iy) > 100) { continue; } turtle.goto(iy, ix); turtle.pendown(); turtle.forward(0.125); turtle.penup(); } } console.log('iter', k + 1); return true }