def g01_moire(rng):
"""MOIRE — two lattice line-stacks, one rotated a few degrees about centre.
Line weight breathes sinusoidally down each stack, so the interference beats
are crossed by a second, slower pulse."""
N = 64
c = Canvas(N, "GEOMETRIC", "lines", "moire", tiles=False)
C = c.C
ang = rng.uniform(3.5, 9.0) * rng.choice([1, -1])
ph = rng.uniform(0, math.tau)
per = rng.choice([7, 9, 11, 13])
for layer in range(2):
if layer:
c.group_open(ang, 500, 500)
for j in range(-N // 2, N + N // 2):
y = (j + 0.5) * C
w = 0.18 + 0.30 * (0.5 + 0.5 * math.sin(j / per * math.tau + ph + layer * 1.3))
c.seg(-400, y, 1400, y, sw=w * C)
if layer:
c.group_close()
return c