Automatically arranging diagrams in a compact circular fashion
import Diagrams.Backend.SVG.CmdLine{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleContexts #-}
import Diagrams.Prelude
import Data.Colour.Palette.BrewerSetThis code demonstrates the circle-packing layout from the diagrams-contrib
package. For more information on the algorithm used, see the circle-packing
package.
import Diagrams.TwoD.Layout.CirclePackingLets collect some objects of varying size and color to draw. They do not need to be single shapes but can be arbitrary complex diagrams, as demonstrated by including some Spierpinsky triangles among them.
colorize = zipWith fc $ cycle (brewerSet Dark2 8)
sierpinski :: Int -> Diagram B
sierpinski 1 = eqTriangle 1
sierpinski n = (s === (s ||| s) # centerX) # alignY (-1/3)
where s = sierpinski (n-1)objects :: [Diagram B]
objects = lw thin . colorize $
scale 0.04 (sierpinski 7) :
scale 0.03 (sierpinski 7) :
[ circle r | r <- [0.1,0.2..1.6] ] ++
[ hexagon r | r <- [0.1,0.2..0.7] ] ++
[ decagon r | r <- [0.1,0.2..0.7] ]And now we can leave the layouting to diagrams-contrib:
example = renderCirclePacking (approxRadius 6) objectsmain = mainWith (example :: Diagram B)