Treat every pixel as a complex c, iterate z = z² + c, and color by how many steps it takes to escape past size 2 — the cardioid and bulb appear on their own

internal 240px · max iterations 96 canvas · z = z² + c · requestAnimationFrame