def g13_quadtree(rng):
"""Cells subdivide where the field changes fastest."""
steps = rng.randint(5, 8)
N = rng.choice([25, 30])
c = Canvas(N, _pal(rng), steps, "quadtree", "squares")
f = Field(rng, "mesh", warp=rng.uniform(0.2, 0.45), steps=steps)
c.ground_from(f)
C = c.C
def emit(x, y, s, depth):
u, v = (x + s / 2) / 1000.0, (y + s / 2) / 1000.0
h = s / 2000.0
vals = [f.raw(u - h, v - h), f.raw(u + h, v - h), f.raw(u - h, v + h), f.raw(u + h, v + h)]
if depth < 3 and (max(vals) - min(vals)) > 0.05 and c.room() > 80:
for dx in (0, s / 2):
for dy in (0, s / 2):
emit(x + dx, y + dy, s / 2, depth + 1)
elif depth:
c.sq(x, y, s, s, f.idx(u, v))
for j in range(N):
for i in range(N):
emit(i * C, j * C, C, 0)
return c