Circular wavefronts
I implemented yet another method to visualize the Mandelbrot Set in Haskell, using circles around points with radius their distance estimate divided by 4 (ensuring no points of the Mandelbrot Set are inside that circle), starting new circles where they intersect.
The algorithm in Haskell:
algorithm :: Integer -> Rectangle -> Set Circle -> Set Circle -> IO () algorithm count bounds active inactive = do when (((2 ^) . round . logBase 2 . fromIntegral $ count) == count) $ do writeFile (show count ++ ".svg") (toSVG bounds active inactive) case S.maxView active of -- Ord Circle is by radius and then (arbitrarily) center Nothing -> do c <- randomBorderPoint bounds case distance . refine . vertex $ c of Nothing -> algorithm (count + 1) bounds active inactive Just d -> algorithm (count + 1) bounds (S.singleton (Circle c (d/4))) inactive Just (me, rest) -> do let them = S.toList $ rest `S.union` inactive new = S.fromList [ Circle q (d/4) | q <- concatMap (intersect me) them , q `inside` bounds , all (q `outside`) (map shrinkSlightly them) , let md = distance . (!!(2^(4::Int))) . iterate refine . vertex $ q , isJust md -- very highly likely, but better safe... , let Just d = md ] algorithm (count + 1) bounds (new `S.union` rest) (me `S.insert` inactive)
It's not the fastest algorithm in the world...